public class testcasting}class animal
}class dog extends animal
}class cat extends animal
}這一行:system.out.println(d1.name); //輸出null
為什麼輸出的是null而不是:bigyellow?
最佳答案:dog d1=(dog)a;
因為這一句的定義是把父類物件強制轉換為子類物件,又因為子類物件有name和furcolor兩個屬性,所以可以去呼叫,而"bigyellow"已經被賦給了父類的name屬性,所以你再呼叫子類的name屬性時就沒有了,只能是null.其實你程式裡把子類都又重新定義乙個name屬性是多餘的.
應該這樣寫.子類不要再定義name屬性,而是直接super(name),這樣的話,父類和子類都通用乙個name屬性,就不會出現錯誤了.而更加符合繼承的思想.
其餘答案:1.因為你在呼叫建構函式的時候呼叫了父類的構造方法,實際上傳入的bigyellow是賦值給了animal介面裡面那個name變數,子類dog的name變數並沒有賦值
2首先要明白繼承的關係,你每個類裡都是用super(name);來進行取值,而super是呼叫超類(也就是父類)裡的東西,你用a物件去點name,肯定能取出,但d1物件是子類的物件,所以取出來為null..
3分析下程式的執行過程如下:
一、首先: animal a=new animal("name");定義乙個引用a指向new animal("name")
二、然後:a=new dog("bigyellow","yellow");
把引用a指向新的物件new dog("bigyellow","yellow");,此時呼叫子類dog的建構函式,即:
dog(string name,string furcolor),建構函式super(name);,表示把dog(string name,string furcolor)中的形參name傳入,並通過super(name);賦值給父類建構函式,即此時的父類中的name的值為bigyellow;
this.furcolor=furcolor;意思是把子類的furcolor賦值為形參furcolor,此時子類的furcolor值為yellow;
三、dog d1=(dog)a,定義乙個子類引用a指向a強制轉換後的子類物件,
而 system.out.println(d1.name); //輸出null
含義是輸出子類d1的區域性變數name.而此時子類d1的區域性變數name並沒有賦值,區域性變數沒有賦值時候,name預設為值為null,故輸出null;
而 system.out.println(d1.furcolor); //輸出 yellow
列印子類d1的區域性變數furcolor,已經賦值為yellow,故輸出yellow
java中的類的向上轉型向下轉型問題
廢話不多說,先寫乙個例子方便後面的嘮叨.向上!class a void tell1 void saya class b extends a void sayb public class demo 在上面的例子裡面定義了兩個類,乙個父子a 乙個子類b 在這裡大家比較迷茫包括我剛開始學的時候不明白a這個...
記乙個關於向上轉型及多型的問題
恢復內容開始 public class program6 class a public string show a obj class b extends a public string show a obj class c extends b class d extends b 這個 源於別人,但...
關於向上轉型與向下轉型的一點個人見解
總結 向上轉型獲得的是繼承和重寫的子類方法,向下轉型獲得的是子類擴充套件的方法。因為要強制性型別轉換,所以向下轉型之前最好用instanceof 判斷一下。關鍵點 在下第一次寫部落格,多有疏漏,望大家海涵!話不在多,而貴於精,這是本人的一點領悟,也希望大家有所收穫!就這樣吧,再會!2017 2 24...