上的乙個向下轉型問題

2021-08-31 15:04:24 字數 1522 閱讀 8020

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...