【请教】一个关于this指针的问题
this指针应该代表被实力化的对象。
如果调用的是一个子类对象继承了父类方法,那么this指针应该仍然代表子类对象。这种情况下如果子类复写了父类方法,调用的应该是覆盖之后的子类方法。
例如:
class Father {
public String s() {
return "Father ";
}
public void show() {
System.out.print(this.s()); // this代表子类对象?
}
}
class Son extends Father {
public String s() { // 复写了父类同名方法
return "Son ";
}
}
Son s = new Son(); // 创建子类对象
s.show(); // 调用子类继承的父类方法,此时this仍然表示子类对象,所以s()是子类复写的方法!
java输出Son.
但是如果将函数改为属性会出现不同的结果:
class Father {
public String s = "Father ";
public void show() {
System.out.print(this.s); // this代表子类对象?
}
}
class Son extends Father {
public String s = "Son ";
}
Son s = new Son(); // 创建子类对象
s.show();
此时将输出Father
我的问题就是为什么第二种情况不会出现子类覆盖父类的情况,是因为this区分对待方法和属性,还是因为java不覆盖属性?
------解决方案--------------------可以参考一下这个:
http://community.csdn.net/Expert/TopicView3.asp?id=5513661
------解决方案--------------------确实是一个好的问题,我想这个问题的主要原因是子类的对象会保存其父类对象的应用,而父类不会保存子类对象的应用,父类不能假设子类会覆盖其属性所至。
------解决方案--------------------晕...第二个例子中..
子类的变量属性不会覆盖父类的变量,这个你要了解一下JAVA虚拟机初始化时的相关绑定机制
覆盖只是指方法的覆盖
两个例子中的this并无矛盾...都是指当前类..例子一中当前类中的s()方法被子类覆盖..故调用子类的方法
------解决方案--------------------其实把问题简单化了来看就是:方法有覆盖,属性没有覆盖(属性叫遮盖).
高手继续......
------解决方案--------------------this表示的当前的类,第一个是方法的重写,所以调用的是子类的show方法,显示的也是子类的show方法.第2个,因为属性没有重写,所以,只是调用父类的方法,显示的是父类的属性.
------解决方案--------------------其实子类继承父类进行方法的重写。
那么你可以记得,如果事例化吊用,那么是调用子类的方法(重写父类的),或者调用父类的成员变量(就是父类的属性)
楼主的THIS指针可以充分的证明这点。
其实有些东西是记住就行。如果你想知道为什么不是调用子类的属性,但他又用子类的方法,其实是想不大通的。
PS:面试题很容易出这个题目。