Java的多型為何可以由子類例項化父類?

時間 2021-05-12 22:59:24

1樓:胖不起來

程式最終執行,取決於你new的是誰,型別只是一種約束,比如,父類有乙個 a 方法,子類重寫了a,並且增加了 b 方法,假如定義是這樣 Father f=new son(),在記憶體中實際存在的是son的例項,那是不是可以呼叫 a 和 b 了呢,不是的,這時候 Father型別就起約束作用了,使用引用 f 你只能呼叫 a 方法,同時記憶體中存在的是son的例項,son存在 a ,所以執行的是son的 a 方法,假如son沒有 a ,但是son有Father給的 a ,這時執行的就是Father的a,如果想要呼叫b,那就對引用 f 進行型別強制轉換為son,相當於來自於Father型別的約束沒有了。總之,記憶體中例項始終沒有變化,一直都是son的例項,你定義的引用的型別,決定了你能使用哪些東西,實際使用的永遠是記憶體中例項的東西。

2樓:懸壺醉世

你需要了解的並不是多型。。。而是JVM結構

簡單的JVM是這樣的。

有乙個棧負責儲存變數,也就是你的obj,obj2

有乙個堆負責儲存物件,也就是你兩個子類物件。

你可以看到變數和物件是分開儲存的,我們中間的等號改變的是他們的指標所指向的物件。(你如果沒有學過C這類語言應該就沒有指標的這個說法。)

父類型別變數改變了指向了子類的物件,這就是多型。我們使用的時候操作的是變數,所以在我們眼裡儘管他指向了乙個子類,其實他還是乙個父類。

那麼好吧,既然他只是乙個父類變數那麼我們就只能使用他的父類方法了,於是我們使用了子類裡面重名的方法methods。

因為他是乙個父類變數,指向乙個子類物件,所以我們呼叫父類的時候呼叫的是子類物件裡的重名方法。

不存在子類這麼大怎麼放進父類的概念,因為你控制的是變數,變數指向物件。

偶爾你以後會遇到乙個常見異常叫做空指標異常,指的就是,你建立了乙個變數但是沒有賦予它物件。

3樓:黑客思維玩遊戲

父類用的方法,它的任意乙個子類肯定都是有的,而子類獨特的方法對於父類的引用來說,它是不知道也是不care的。父類引用無論指向的是父類的物件還是子類的物件,它只會說,我不管你有多少個方法,但是定義在我身上的那幾個方法,我隨時可能會呼叫,你能保證有就行,所以父類的引用是答應接受子類的物件的。而反過來不行,子類的引用絕不會答應。

這就是所謂的黎克特制代換原則.

當父類的引用要執行方法1的時候,他只會跟他指向的物件說,「嗨,哥們,執行一下你的方法1」然後他就不管了,繼續睡大覺去了。然後真實的物件例項就會低頭看看寫在自己身上的方法1,捏出來執行一把。這個時候如果子類物件重寫了方法1,捏出來的就是重寫的方法。

如果沒重寫,就會找他爸,從他爸身上去捏方法1出來。

這就是所謂的動態繫結

如果父類、子類定義了相同名字的成員屬性,那麼這兩者是同時存在的。

比如,都定義了age屬性,父類初始化為30,子類為5。obj.age得到的結果到底是30還是5,只取決於引用的定義型別。

父類 obj = new 子類();// obj.age == 30

子類 obj2 = new 子類();// obj2.age == 5

4樓:love小歐是我

因為子類會從父類那繼承到方法或變數,所以父類有的子類都有,你要明白執行是分編譯階段和執行階段

像父類=new 子類()

其實這屬於迷惑編譯器(可以這樣理解,父類不可以呼叫子類方法,除非在向下轉型,告訴這是子類),實際上他還是子類,所以呼叫的是子類的方法

這樣做有許多好處

例如你寫的乙個傳參是動物,但貓什麼的都可以傳入,因為動物 xx=new 貓()

5樓:若初見

子類是父類的增強,父類有的子類也會有,所以向上轉型是安全的,即可以使用父類的情況下實際使用的是子類的引用也是合適的。override的實現主要是方法的動態分派(dispatch)。new 子類返回乙個子類的引用,不管靜態型別是父類還是子類,實際都指向乙個子類例項,循著繼承鏈去尋找符合對應方法簽名的方法然後呼叫。

6樓:鬍子我是不會刮的

父類 obj = new 子類();

obj.methods

這個obj不是子類的例項麼,當然可以呼叫子類的方法了。

子類裡的方法你看是過載父類的方法,還是重寫。如果是過載的話那父類是沒法呼叫的,因為相當於父類裡沒該方法,重寫的話是可以呼叫的

java中子類有沒有繼承父類的私有變數?

atlanc 確實是繼承了,但是父類臨終前對子類說,這筆遺產,你不能亂動,只能用我的非private方法來動。也就是說,父類的private屬性都會遺傳給子類,但是子類只能沿襲父類的生活習慣來使用這些屬性。 肖遙 我看到官方文件說不能繼承私有成員的時候也懵了。標準答案是 不能繼承 但是這裡的處理是很...

Java子類到底有沒有繼承父類的私有字段?

Seven555 當初自己也有小糾結一下這個問題,不過後來看debug就明白啦public class Person public class Student extends Person 自己在寫個main函式測試一下,new乙個student物件,eclipse的debug結果 實際上有繼承過來...

JAVA的子介面可以覆蓋父介面中的方法,這樣做有什麼意義嗎?

飯後一杯酒 這樣做是沒有意義的。因為介面本身的意義在於對行為的抽象,以spring中BeanFactory為例,其存在的含義在於定義如何建立 獲取beanDefinition。而建立 獲取beanDefinition可以看作是一種行為,BeanFactory則完成了對這些行為的定義。那麼子介面又是做...