看一下:如下一段简单的代码
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 。