抽象类继承初始化问题

package demo1;

public abstract class Super {
Super(){
print();
}
public abstract void print();
}

package demo1;

public class Sub extends Super{
private int i = 10;
public void print(){
System.out.println(i);
}
public static void main(String args[]){
Sub sub = new Sub();
sub.print();
}
}

Output:
0
10

这是为什么??

1个回答

这个涉及到类的初始化的问题
当你入口类Main方法里掉用Sub sub = new Sub(); 触发Sub类初始化,但他发现他有父类Super,而Super类没有初始化,所有先初始化父类,当初始化父类的时候,他的构造方法调用了一个抽象方法,所有找到子类的实现,(注意:这个时候的i值是0,默认值),所有输出0,之后初始化子类Sub, i的值是10,当调用print方法时候输出10

jlgzggwl0
jlgzggwl0 其实父类的方法已经被子类重写覆盖了,如果你的父类的方法不是抽象方法的话,你要调用的话只能通过super.方法名 调用,要不调用的依然是父类被子类的重写方法。
接近 5 年之前 回复
foreverxunyc
forever_cherry 也就是说在初始化父类构造器的时候发现有调用抽象方法后会自动找到其子类的实现,尽管子类的成员变量还没有被初始化,但是抽象方法已经被实现,所以输出的是0,父类初始化完成后,初始化子类。这么说是行得通。。。可是还是觉得父类在初始化时跑去调用子类的方法怪怪的。。。
接近 5 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!