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條經驗 獲得超7個贊
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
提交
取消