【发布时间】:2012-02-21 17:14:22
【问题描述】:
考虑以下代码类。
public class A
{
public A()
{
callCreation();
}
protected void callCreation()
{
System.out.println("A Created!!");
}
}
public class B extends A
{
protected void callCreation()
{
System.out.println("B Created!!");
}
}
public class C extends B
{
protected void callCreation()
{
System.out.println("C Created!!");
}
public static void main(String[] args)
{
A a = new A();
A b = new B();
A c = new C();
}
}
运行C类的输出如下。
一个创造!! B创建!! C创建!!输出中的第一行输出
A Created!!被打印是因为在调用类 A 的构造函数时,它在调用类 A 的构造函数中的 callCreation() 方法之前隐式调用了超类的构造函数 (java.lang.Object)。 B 类和 C 类也是如此。在这种情况下,当调用 B 的构造函数时,调用流程通常应该是:B 的构造函数 -> A 的构造函数 -> java.lang.Object 的构造函数 -> 回到 A 的 callCreation() 方法以完成调用 A 的构造函数。如果是这样,如何打印覆盖的值而不是打印超类的值?所以问题是'什么时候准确地创建了一个类的对象?换句话说,只有在构造函数完成调用/初始化其自身的所有元素之后,才能创建类的对象。如果是这样,如何从子类而不是父类调用方法?
【问题讨论】:
标签: java object constructor creation