簡體   English   中英

Java 實例方法的堆棧幀中的超級引用在哪里?

[英]Where is the super reference in a Java instance method's stack frame?

我閱讀了 Bill Venner 出色的 Inside the Java Virtual Machine 一書,該書在第 5 章中詳細探討了 JVM 堆棧幀的組成等內容。 (本書的這一章也恰好在這里正式發布: https://www.artima.com/insidejvm/ed2/jvm8.html )除了這本書,我研究了一些JVM的運行時數據區,尤其是它們堆棧和堆。

在實例方法的堆棧幀中,局部變量部分構成一個單詞數組,其中包含方法 arguments (或參數)、局部變量和“隱藏”的this 引用

我想知道的是,超級引用存儲在哪里,因為它在任何非靜態上下文(即實例方法體或初始化程序塊)中也始終可用,除了在 Object class 中。 它是否存儲在參考“this”旁邊的某個地方? 如果是,那么為什么它似乎總是從堆棧幀表示/概述中排除?

沒有“超級”參考。

當你這樣做時:

super.foo()

您“似乎”在名為“super”的 object 上調用foo ,但這只是 Java 的語法,不必反映幕后發生的事情。 當這個調用被翻譯時,它被翻譯成一個invokespecial指令,該指令調用超類的foo方法。

將此與this.foo()調用進行比較,后者轉換為invokevirtual指令。 invokespecial不同,this 將執行動態調度,根據this的運行時類型選擇要調用的正確方法。

請注意,在這兩種情況下,在調用方法之前都有一個aload_0指令,將this引用加載到堆棧上。

你認為的“隱藏的這個”參考並不存在。

如果您調用super.toString() ,則super被解析並存儲為“隱藏這個”。 因此,一旦創建了runInstanceMethod()的堆棧幀(在我們的示例中為toString() ,“隱藏的 this”就是前一個 super。

也就是說,‘hidden this’總是指當前成員方法所屬的object。

暫無
暫無

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

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