Java 中的多型,為什麼子類例項能夠賦值給父類引用,反之則不行?

時間 2021-05-29 23:02:54

1樓:喬冬

父類引用指向子類物件,但實實在在所能看得到的只是屬於父類的那部分屬性和方法。

變數c可以訪問到A物件的屬性和方法,這樣是可行的。

記憶體圖如下:

父類引用指向子類物件

假如子類引用可以指向父類物件,所能看到的是子類和父類的全部屬性和方法

記憶體圖如下:

子類引用指向父類物件

正常情況:變數c可以訪問到子類和父類的所以屬性和方法。

但是:這時候還沒有子類物件,不可能訪問到子類的屬性和方法,產生矛盾,所以不行。

2樓:

子型別的意義就是說:子類可以被當作父類使用。

比如說。你寫了個方法叫切水果,引數是水果型別然後蘋果是水果的子類。那就可以把蘋果型別的東西傳給這個方法。

反過來就不行了。你寫了方法叫切蘋果,然後傳給它乙個水果,但是水果不一定是蘋果啊

所以就不允許了。

如果你知道這個水果一定就是個蘋果,那你就需要轉型,但切蘋果這個方法還是只接受蘋果。

3樓:裴先生

因為兒子孫子繼承了祖輩的所有技能,所以兒子孫子可以在關鍵時刻當祖輩使出這些技能,但是調過來不行,子孫輩新get的技能祖輩不具備,所以反過來用肯定不行的。比如爸爸會說家鄉話,好,子孫可以繼承說家鄉話的本事,後來孩子們學會了說英語,但是你讓長輩使出說鳥語的本領他不會啊,就是這個道理,例子不一定恰當,記住因為有繼承機制子具備父的能力,父不能反過來繼承子的能力,我兒子在咿呀學語的時候說』爸爸,你的這一點太隨我了』,其實他想說的是太像他了,把我給樂的啊,顯然他不知道類裡面的繼承關係是什麼樣的,我得教他祖傳的程式設計技能。

4樓:

因為沒必要..

舉個具體例子: 父類是「貓」 子類是「花貓」 你可以 new「花貓」當「貓」來用,因為「花貓」具有貓的所有屬性,但是不能反過來,因為「貓」不具有「花貓」的屬性。

5樓:

B類的物件指向A類的例項有啥用?你又不是個B。應該是所有A類的子類的物件都可以被當作A的例項來使用,這樣才能串起一堆物件吧~

6樓:MRS·CHENG

很簡單的比喻,蘋果是水果吧,蘋果也可以看作是水果的子類吧 ,那你也可以把蘋果稱之為水果吧,子類向上轉型成父類,那你Y的不能見是水果的東西都叫它蘋果吧,父類不能轉型成子類。

7樓:

其實,如果編譯器如果加乙個語法糖,把 A c = new B(); 和 B c =new A(); 作為等同的語句解析:選擇這個語句兩端介面最寬的類來建立物件,也就可以了。不過這樣會看起來比較怪異,不合現在語法模式下的邏輯,呵呵。

按現在的語法理解,樓上的說明已經很充分了。

8樓:孫立偉

class A

class B extends A

B o = new A(); //如果成立的話o.b();//那麼會有什麼後果?

變數o的實際型別為A,而A是沒有方法b的定義的。這個是違反物件導向原則的做法。

9樓:徐辰

B是A的子類,所以B裡可能會包含一些A裡沒有的成員,如果允許B x=new A(),萬一你要對x使用B裡才有的成員怎麼辦?

c 中進行型別轉換時,為什麼子類可以隱式轉換到父類?

面對物件原則之,黎克特制替換原則。Liskov於1987年提出了乙個關於繼承的原則 Inheritance should ensure that any property proved about supertype objects also holds for subtype objects.繼承...

為什麼說 JAVA中的ThreadLocal是最簡單的非阻塞同步 ?

Joash ThreadLocal是存在於Thread類中的資料結構。它用於遮蔽自己的資料,防止其他執行緒訪問。然而同步問題所涉及的不僅僅是乙個執行緒或者是程序。同步的出現必定涉及到了執行緒或程序間的共享資源。對比兩個概念真的沒有發現有什麼共同之處。multithreading ThreadLoca...

在Java中,為什麼override(重寫或覆蓋)必須有相同的引數列表,這背後的內在機理是什麼?

舒琴 思考一下 如果覆寫不需要相同的引數列表,當父類有多個過載方法 函式名一樣但引數列表不一樣 子類去覆寫的時候,編譯器應該呼叫哪乙個? 上面回答已經基本完備了。你要是學了Golang,就沒有這個疑問了,GO中同乙個包不允許有同名函式。即同名不同引數列表也不行 Aetherus 甲 為什麼巧克力蛋糕...