2 zhaiguo42 zhaiguo42 于 2015.06.17 15:20 提问

求解一个关于JAVA的问题

我的代码如下:

public abstract class Example1 {
abstract void testAbstract();
Example1(){//(1)首先执行父类构造方法
System.out.println("before testAbstract()");
testAbstract();//如果调用了抽象方法,调用子类覆盖的方法。这里调用Atest类的testAbstract()方法
System.out.println("after testAbstarcat()");
}
public static void main(String args[]){
new Atest();
}
}
class Atest extends Example1{
private int i=1;//(2)使成员变量进行初始化
void testAbstract(){
System.out.println("testAbstract()"+i);
}
public Atest(){//(3)调用子类构造方法
System.out.println(i);
}
}
Eclipse执行结果如下:
before testAbstract()
testAbstract()0
after testAbstarcat()
1

我刚接触java不久,请教为什么是“testAbstract()0”而不是“testAbstract()1”?

7个回答

bdmh
bdmh   Ds   Rxr 2015.06.17 15:36

先执行父类的构造,此时Atest类自己的i还没有初始化,所以是0

danielinbiti
danielinbiti   Ds   Rxr 2015.06.17 15:36
 java初始化过程
 父类变量初始化-父类构造函数-子类变量初始化-子类构造函数。
 也就是父类构造函数中调用testAbstract是访问子类的testAbstract方法,而根据顺序这时候子类的变量i还进行赋值,还是默认值0.
frank_20080215
frank_20080215   2015.06.17 16:04

初始化时,先调用父类构造函数

u013166918
u013166918   2015.06.17 16:58

有父才有子,有个先后顺序记住就行了

wsh1992o
wsh1992o   Rxr 2015.06.17 20:35

子类的成员在被调用的时候会自动调用父类的构造函数并初始化父类的相应成员

beacon_2011
beacon_2011   Rxr 2015.06.17 21:33

先执行父类再执行子类

cuiwei1026522829
cuiwei1026522829   Ds   Rxr 2015.06.18 00:18

这个顺序就是先执行父类,然后是子类,也是为了达到代码的重复利用吧

Csdn user default icon
上传中...
上传图片
插入图片