猿问

一段小程序的疑问

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的值的。为什么?请详细解释一下 最好能有个内存说明!


拉莫斯之舞
浏览 528回答 3
3回答

LEATH

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

陪伴而非守候

father.a访问不到a是因为Father类中没有a这个变量,所以编译器找不到a,就报错了,属于编译器的编译规则。Debug调试的时候,你看到的是new出来的Son对象的内容,所以和father是否能够访问到a没有关系。属于debug调试器的功能,只要你new了Son对象,debug调试器就能监视到Son对象中的内容,以方便你调试程序。

不负相思意

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

相关分类

Java
我要回答