探讨一个关于“继承”的问题

本文通过一个简单的Java示例解释了在子类继承父类的情况下,如何理解this关键字指向的具体对象,以及它如何帮助我们区分子类和父类中同名的成员变量。

看一下:如下一段简单的代码

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 。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值