2017-02-20 224 views
-1

這是很瑣碎的問題,但未能找到非常精確的答案,任何人可以解釋在存儲時會發生什麼我聲明一個變量,如:Java對象實例化

Animal obj= new Horse(); 

如果出現上述聲明類型(動物)對象是不同的,初始化(馬)。現場發生的事情。

+5

沒什麼。 JVM不會像這樣攜帶類型信息。這些信息僅在編譯器中保存。請注意,在C++中,會有不同的答案。 – Falmarri

+4

@Falmarri你完全一直在前面。這些信息完全在C++編譯器中,暫時擱置RTTI。 JVM在字節碼中攜帶類型信息。 – EJP

+0

這[其他答案](http://stackoverflow.com/a/20097325/697630)似乎有些相關。 –

回答

-1

當你聲明像那樣,那麼將爲馬類創建對象,它將在堆內存中創建。希望你找到足夠的答案。 :)乾杯!

1

Animal obj = new Horse();

你正在構建一個對象obj,可以做馬或動物的工作。 馬是從動物遺傳。這樣你可以訪問Animal的所有屬性和方法。

並在此處找到這個 這是多態性的基礎:想象一下,您有幾個繼承自父類的子類。您希望通過父類上定義的接口/方法來使用所有這些子類,而不必擔心每個子類中的實現細節(每個類可能會做不同的事情,但具有相同的整體語義)。

這是可能的,因爲孩子類與其父類具有IS-A關係,因爲孩子從父類繼承。

我建議你要學會繼承&多態性:

+0

假設'Horse'確實是'Animal',這在問題中並不明顯,因爲OP沒有分享他們的定義。最有可能的情況是這樣。 –

1

當曾經使用new關鍵字創建一個對象。對象在堆中創建。 new Horse()將在堆中創建一個對象Horse,並按照類Horse.java進行初始化。

現在提出的案例假設Horse繼承自Animal。通過AnimalAnimal a = new Horse())類型的變量引用Horse的對象不會影響對象創建(即使您執行的操作是Horse h = new Horse(),也會創建對象)。它只使用超類類型的變量來限制類Horse中存在的附加方法的調用。如果你想調用類Horse的方法,你需要投它。但需要注意的是,我們可以調用底層藍圖類創建的對象中的所有內容。這就是爲什麼如果你重寫一個方法,那麼它是無關緊要的,如果你有一個超類型的變量,或者如果你投了一個變量HorseAnimal或者你簡單地使用Horse類型的變量引用Horse的一個方法,調用一個被過度的方法將始終導致重寫行爲。

這些是我們作爲程序員必須理解的東西,其餘部分應留給JVM實現。內部炒作的方式可能會在不同的平臺上發生變化,但合同和最高級別的最終結果總是相同的。

+1

因爲「Horse.java」不是類,而是源代碼文件,所以您應該可以說「按照類Horse」而不是「根據類Horse.java」。它可能包含類定義,但它不是類本身。另外,如果'Horse'確實在該文件中定義了,我們就不能確定這個問題。 –

+0

@Edwin Dalorzo,你是對的,我編輯答案感謝指出 –

-1

這是java中的多態,明白嗎?準確地說,這也被稱爲動態綁定。我認爲,作爲一個新手,我們只知道如何使用是好的,我是新來的操作系統,請霧我的中國英語= _ =

+0

我不認爲這真的回答了這個問題。只是給出條款(「多態」和「動態綁定」)並不能真正幫助某人理解。 – ajb

+0

對不起,我真的錯了!!!!!!! –

+0

@李鵬程its ok。其實我們必須知道如何使用它,並且知道你需要很好地瞭解這個概念。 JVM如何完成它並不像平臺依賴那麼重要。由JLS制定的合同是重要的。 –