亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

一段小程序的疑問

一段小程序的疑問

拉莫斯之舞 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條經驗 獲得超7個贊

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 關注
  • 521 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號