看一下:如下一段简单的代码
public class Father {
private int i = 1;
public void p(){
System.out.println(this.i);
}
}
public class Son extends Father {
private int i = 10;
public void q(){
System.out.println(this.i);
}
}
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
Son son = new Son();
son.p();
}
}
输出为1
理解:因为子类继承自父类,而p这个方法是从父类那继承过来的,所以对于p这个方法来说,this是代表父类的.所以是1.不信,把父类的i变量去掉肯定会报找不到变量的异常的。方法中this 关键字表示隐式参数,也就是被构造的对象,调用是该对象的方法和变量。
Son的内存地址空间其实是有两个变量i,一个是从父类继承来的,一个是自己声明的, 千万不要以为子类变量把父类的覆盖了, 当调用父类的方法时,此时的进入的堆栈地址空间是父类的地址空间。
你debug模式,当进入p()方法里,把this加到Expressions里,就可以看到
"this"= Son (id=17)
i (Father)= 1
i (Son)= 10
this对象当然是代表Son ,因为只用Son son = new Son(); 新建了一个对象嘛, 因为方法是父类的,所以调用this.i得到的就是i (Father)= 1 。
"this"= Son (id=17)
i (Father)= 1
i (Son)= 10
this对象当然是代表Son ,因为只用Son son = new Son(); 新建了一个对象嘛, 因为方法是父类的,所以调用this.i得到的就是i (Father)= 1 。
本文通过一个简单的Java示例解释了在子类继承父类的情况下,如何理解this关键字指向的具体对象,以及它如何帮助我们区分子类和父类中同名的成员变量。

被折叠的 条评论
为什么被折叠?



