簡體   English   中英

動態(運行時)多態如何在Java中工作? 換句話說,JVM如何知道要調用的方法?

[英]How does Dynamic (run-time) polymorphism work in java? In other words how does the JVM know which methods to call?

假設您有一個對象的arrayList ArrayList<Object> arr = new ArrayList<Object>(); 然后用幾個不同的對象填充此arraylist,所有這些對象都繼承自object

arr.add(new Integer(1));
arr.add("Im a String");
arr.add(new SomeOtherObject);

假設您然后遍歷arrayList調用.toString()方法,這實際上將按預期工作,調用StringInteger類的重寫的toString()方法,令我感到困惑的是JVM, IntegerString對象在arrayList的內部被隱式轉換為對象,因此,JVM在世界上如何知道將它們轉換回它們放入arrayList之前的狀態? 抱歉,這個問題的答案很明顯,但這對我來說似乎沒有多大意義

每個對象的類型都存儲在該對象的標頭中。 當您對對象進行引用時 ,這不會以任何方式改變對象。

例如,當您調用.toString ,它將從類的描述中查找要調用的方法。 注意:如果它可以優化代碼,則不必每次都這樣做。

假設您有一個Foo class並且有一個名為arrArrayList<Object> 當您說arr.add(new Foo()) ,將Foo class的新對象作為新元素添加到arr中。 這是可能的,因為Foo是一個class並且是從Object繼承的。 但是,即使FooObject繼承,該對象也是Foo 因此,當您調用其toString ,它將調用您創建的Foo對象的toString

讓我們假設你有一個數組列表Bird S和Eagle小號fly精美。 因此,如果您調用實際上是EagleBirdfly()方法,它將飛行精美。 實際上,這是繼承的一個重要功能,並且非常有意義。

事實是,JVM不知道如何將它們轉換回原始狀態。 我們將必須為此完成任務。 考慮一下...(在您的代碼行之后)

SomeOtherObject obj = arr.get(2); //trying to access the third element

您肯定會得到編譯時錯誤。 OK,現在嘗試顯式轉換返回的對象。

SomeOtherObject obj = (SomeOtherObject)arr.get(2);

它工作得很好! 為什么? 因為從get()方法返回的對象與要轉換的類型兼容。

現在還要考慮這一點(我知道我做不到),只是為了檢查JVM是否可以告訴我們哪個對象是什么。

SomeOtherObject obj = (SomeOtherObject)arr.get(1); //1 instead of 2

是的,我知道此數組的第二個成員是字符串,我不能這樣做。 但是讓我們看看JVM有什么要說的(盡管沒有編譯器錯誤)。 我們得到的消息是該對象無法轉換為指定的類型。 (但是我們沒有得到對象的確切類型)。

你明白了嗎? JVM在這里只知道傳遞給該數組的對象就是與Object兼容的對象。 不知道我們是否實際傳遞了String,一個int(或更確切地說是Integer,因為原語不能存儲在集合中)或SomeOtherObject(Java中定義的任何類都是Object的直接子類)。

現在回答您的問題:

  1. (我如何使String和Integer恢復正常(盡管我仍然必須進行類型轉換))原因是String和wrapper類(Integer是包裝器類)已經覆蓋了從繼承的toString()方法。賓語。 因此,打印這些對象將給出實際值。

  2. (JVM如何知道將其轉換為哪種類型)JVM在返回用戶之前實際上並不知道要將哪個對象轉換為哪種類型。 它將僅返回Object的實例(這是JVM都知道的關於對象的信息)。 我們將必須將其顯式轉換為適當的類型。

希望我回答了你的問題。 讓我知道是否不清楚。

有關運行時多態性(您的標題問題)的詳細描述,請參見以下站點: http : //www.javatpoint.com/runtime-polymorphism-in-java

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM