为了账号安全,请及时绑定邮箱和手机立即绑定

一段小程序的疑问

一段小程序的疑问

拉莫斯之舞 2019-03-14 18:15:48
public class Father { public static void main(String[] args) { Father father=new Son(); System.out.println(father.a); } public Father(){ System.out.println("i am father"); } public void read(){ System.out.println("father is reading"); }}class Son extends Father{int a = 10;public Son(){System.out.println("i am son"); } public void read(){System.out.println("son is reading");}public void write(){System.out.println("son is writing");}}这样一段代码,编译是不通过的,因为Main 方法中调用不到Son类中的成员变量a,但是删掉打印语句,用Debug调试的时候创建的father引用中是可以看到a的值的。为什么?请详细解释一下 最好能有个内存说明!
查看完整描述

3 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

Father father=new Son();

这句中的father只是一个引用。
那么引用所指向的真正内存还是Son。
你debug的时候显示的内容是内存里面的东西。
那当然会有a。
编译不通过是因为:
这时候你已经向上转型了。那么转型后会丢失部分的类型信息。这里就是son中的a。

查看完整回答
反对 回复 2019-04-26
?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

father.a访问不到a是因为Father类中没有a这个变量,所以编译器找不到a,就报错了,属于编译器的编译规则。

Debug调试的时候,你看到的是new出来的Son对象的内容,所以和father是否能够访问到a没有关系。属于debug调试器的功能,只要你new了Son对象,debug调试器就能监视到Son对象中的内容,以方便你调试程序。


查看完整回答
反对 回复 2019-04-26
?
不负相思意

TA贡献1777条经验 获得超10个赞

这个是动态绑定特性吧,Father f = new Son();
这里是把Son类的对象实例动态绑定了Father 类的引用,当你使用f.read()主法时,编译器会根据绑定的信息,调用Son实例的read()方法。
 至于为什么f.a不可以,也就是编译器根本知道Father根本没有a 这个属性,当然就通不过了。debug时候对象是对ide透明的,所以你看到得a属性。


查看完整回答
反对 回复 2019-04-26
  • 3 回答
  • 0 关注
  • 504 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号