前几天在网上看java笔试题,看到下面这个题目,然后在自己的环境下执行了一下,觉得很有收获,
class testA {
private int id=9;
public testA(){
a1();
}
public void a1() {
System.out.println("this is A");
}
}
public class testB extends testA{
private int id=8;
int bb=0;
public testB() {
bb=1000;
super.a1();
a1();
}
public void a1() {
System.out.println("bb is "+bb);
System.out.println("B-a1");
}
public static void main(String[] args) {
new testB();
}
}
大家先猜猜这个执行的结果。
结果是:
bb is 0
B-a1
this is A
bb is 1000
B-a1
以上结果表明:在new()的具体过程是这样的,当new testB(); 的时候首先执行父类的构造方法,父类的构造方法调用了a1();此时编译器又检查到testB重写了a1()这个方法;所以执行的是子类的a1()方法。由于此时还没有执行testB()的构造方法,所以bb=0;所以才有上面的结果。