[英]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.