日期:2014-05-20  浏览次数:20601 次

【请教】一个关于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:面试题很容易出这个题目。