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。

陪伴而非守候
TA贡献1757条经验 获得超8个赞
father.a访问不到a是因为Father类中没有a这个变量,所以编译器找不到a,就报错了,属于编译器的编译规则。
Debug调试的时候,你看到的是new出来的Son对象的内容,所以和father是否能够访问到a没有关系。属于debug调试器的功能,只要你new了Son对象,debug调试器就能监视到Son对象中的内容,以方便你调试程序。

不负相思意
TA贡献1777条经验 获得超10个赞
这个是动态绑定特性吧,Father f = new Son(); 这里是把Son类的对象实例动态绑定了Father 类的引用,当你使用f.read()主法时,编译器会根据绑定的信息,调用Son实例的read()方法。 至于为什么f.a不可以,也就是编译器根本知道Father根本没有a 这个属性,当然就通不过了。debug时候对象是对ide透明的,所以你看到得a属性。
添加回答
举报
0/150
提交
取消