![](/img/trans.png)
[英]Remove successive 0th entries in args[] for a Java command line interface?
[英]Java - When is the 0th local variable not 'this'?
在Java方法的局部變量中,第0個局部變量何時不會引用'this'?
我可以將靜態方法看作反例,還有其他方法嗎?
更新:我指的是字節碼
JVM規范部分2.6.1似乎認為它只取決於它是靜態(類)方法還是實例方法:
Java虛擬機使用局部變量在方法調用上傳遞參數。 在類方法調用中,任何參數都在從局部變量0開始的連續局部變量中傳遞。在實例方法調用中,局部變量0總是用於傳遞對調用實例方法的對象的引用(這在Java中)編程語言)。 隨后,任何參數都在從局部變量1開始的連續局部變量中傳遞。
這是局部變量的初始值; 請參閱Mike Strobel的答案,了解在該方法中明確更改的示例。
有兩種情況我知道的地方時,#0指的不是this
:
第二種情況完全有效。 本地#0僅保證在進入實例方法時引用this
。 在該方法中,關於時隙#0沒有任何固有的“特殊”; 它可以(重新)寫成任何其他插槽(正式參數使用的那些插槽)。 請考慮以下Jasmin格式的示例:
.class public HelloWorld
.super java/lang/Object
.method public <init>()V
.limit stack 2
aload_0
invokenonvirtual java/lang/Object/<init>()V
ldc "Hello World."
astore_0
getstatic java/lang/System/out Ljava/io/PrintStream;
aload_0
invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
return
.end method
.method public static main([Ljava/lang/String;)V
.limit stack 2
new HelloWorld
invokenonvirtual HelloWorld/<init>()V
return
.end method
在HelloWorld/<init>()V
,我們用常量字符串覆蓋本地#0。 因此,第二次使用aload_0
會加載除this
指針之外的值。 同一個局部槽在代碼中的不同點引用不同的“概念”變量並不罕見,特別是如果一個類已經通過字節碼優化器運行。
所以,回答你的問題:是的,至少還有一個反例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.