代码如下:
class a {
public int avar;
public a() {
system.out.println("aaa");
dosomething();
}
public void dosomething() {
avar = 1111;
system.out.println("a.dosomething()");
}
}
public class b extends a {
public int bvar = 2222;
public b() {
system.out.println("bbb");
dosomething();
system.out.println("avar=" + avar);
}
public void dosomething() {
system.out.println("bvar=" + bvar);
}
public static void main(string[] args) {
new b();
}
}
讲解:
顺序是这样得,首先生成b就得先生成a,
所以调用a的构造器,输出aaa,
然后调用方法dosomething,!!!
注意:a的该方法被b覆盖,
而你生成的是b的对象,
所以它调用b的方法,
由于bvar目前没有给定值,
所以自动初始化为0,
然后生成b对象,
先初始化变量bvar,
然后调用构造器输出bbb,
然后调用方法,
这时bvar已初始化,
所以输出bvar=2222,
而对象a中变量avar由于没有调用对象a的方法dosomething,
所以其值为0,则输出0
全部输出就如下:
aaa
bvar=0
bbb
bvar=2222
avar=0
注意:初始化顺序,当继承时,先生成超类对象,生成对象时,先生成静态变量,然后是一般变量,然后调用构造器!当所以超类对象生成后,生成本对象,顺序一样! 当方法被覆盖时,调用目前对象的方法!这得注意
闽公网安备 35060202000074号