如下实例提出问题:
class T{
T(){
System.out.println("T()");
}
void foo(){this.bar();}
void bar(){
System.out.println("T.bar");
}
}
class B extends T{
B(){
System.out.println("B()");
}
void foo(){
super.foo();
}
void bar(){
System.out.println("B.bar");
}
}
public class test {
public static void main(String[] args) {
B b=new B();
b.foo();
}
}
结果输出如下:
其实我相信这样的结果可能大家都是惊讶的,b.foo()实际是调用了父类中的foo()方法,方法主体为this.bar
由结果可以得到this实际指的是子对象。
分析:
由输出结果可见,当创建子类对象时首先调用了父类的构造方法,再调用子类的构造方法,值得注意的是传给父类构造方法的this指针和传给子类构造方法的this指针完全相同,也就是说调用父类构造方法的并不是父类的对象,所以在创建子类对象时并没有创建父类对象。this指向的仍然是子对象,同时由于子类重写了父类的bar()方法,所以输出为B.barr
在原代码上做轻微改动如下:
class T{
T(){
System.out.println("T()");
}
void foo(){this.bar();}
void bar(){
System.out.println("T.bar");
}
}
class B extends T{
B(){
System.out.println("B()");
}
void foo(){
super.foo();
}
/*void bar(){
System.out.println("B.bar");
}*/
}
public class test {
public static void main(String[] args) {
B b=new B();
b.foo();
}
}
输出结果如下:
由于此时子类并未重写父类方法,故输出为T.bar