问题描述
- 关于继承的问题,求帮忙解答下,谢谢
-
public class Demo
{
public static void main(String[] args){new B(); }
}
class A
{
void aFunction(){
System.out.println("AFunction");
}
A(){
System.out.println("A");
aFunction();
System.out.println("after A");
}}
class B extends A
{
private int values=1;
B(){
System.out.println("B");
}
void aFunction(){
System.out.println("values="+values);
}
}/*output:
A
values=0
after A
B
*/
求解为何父类的构造函数里面调用aFunction()方法,不应该调用自己的吗,怎么调用的是子类的方法?谢谢大家
解决方案
构造函数内调用派生类重写的函数,会导致不可预期的结果(虽然编译器不禁止你这么做)。应该避免这种情况的发生。
Java类的初始化顺序是
先构造A,然后调用A的构造函数,然后构造B,最后调用B的构造函数。
如果B的方法aFunction()调用了B的成员字段比如values,那么如你所见,会没有初始化。如果这个成员是复杂的对象,结果更加微妙。
这个例子应该只是告诉你不应该这么调用。
解决方案二:
B继承了A,你只构造了B,构造B要先构造A,你构造A的时候就会调用A的aFunction()函数,最后再构造B,B的构造没有调用自己的函数啊。这就是你打印的结果