public class testconstruct{
public static void main(String[] args){
B b = new B();
}
}
class A{
void draw(){System.out.println("A");}
A(){draw();}
}
class B extends A{
void draw(){System.out.println("B");}
B(){draw();}
}
如果对C++比较熟悉,可能会觉得上面这个Java程序的运行结果会是 AB。
实际上是BB。
这个现象如果拿C++的模型去套,会觉得很疑惑。父类A他根本看不到子类B的函数。父类A如何去调用一个子类的方法?
再看下面的程序
public class testconstruct{
public static void main(String[] args){
B b = new B();
}
}
class A{
void draw(){System.out.println(this.getClass());}
A(){draw();}
}
class B extends A{
void draw(){System.out.println(this.getClass());}
B(){super();draw();}
}
如果显示的看this指针是什么,你就知道为什么了。
运行结果是 class B class B
B调用super();时,默认把this指针传给了A的构造函数。而A调用super(),也就等价于this.draw();,而我们知道类实例调用一个函数时,会动态选择调用的方法。所以调用子类的方法也就不足为怪了。
一个this指针就可以解决这个疑惑。