JAVA 多态问题
你这真是个好问题,解释起来比较复杂。
testAbstract()0 是因为你的方法调用用在构造器里了。
用 new Atest() 构造一个实例,实际执行以下步骤:
1, 因为Atest继承了Practice1013,所以先调用父类的构造器,然后在执行子类的构造命令。
2, Practice1013的构造器 打印 before...
3, Practice1013的构造器 调用 抽象方法 testAbstract(),这时它实际调用Atest类里的testAbstract()方法,但是Atest还没有构造完成,所以 i 还没有被赋值,i 用初始值 0。
显示的是 “testAbstract()0”
4, Practice1013的构造器 打印 after...
5, 父类构造完毕,继续构造子类, 子类先初始化成员变量 i=2, 然后继续执行子类的构造命令。
这个时候i已经被赋值了,所以是 “2”。
什么时候是 ”testAbstract()2“ 呢?以下3种都可以实现。
1, 用 private static int i = 2;
2, 用 private final int i = 2;
3, 抽象方法 testAbstract()的调用不要写在父类构造器里,比如:
public Practice1013() {
System.out.println("Practice1013");
}
public void b(){
System.out.println("before...");
testAbstract();
System.out.println("after...");
}
public static void main(String[] args) {
new Atest().b();
}