JAVA 多态问题

为什么第二个结果为testAbstract()0可我认为应该是testAbstract()2... 为什么第二个结果为testAbstract()0 可我认为应该是testAbstract()2 展开
 我来答
马亦丁
2015-03-05 · TA获得超过166个赞
知道小有建树答主
回答量:105
采纳率:0%
帮助的人:87.5万
展开全部

你这真是个好问题,解释起来比较复杂。


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();
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式