簡體   English   中英

Java - 第0個局部變量何時不是'this'?

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

  1. 在靜態方法中,如@JonSkeet所述。
  2. 在實例方法中,本地#0已被某個其他值覆蓋。

第二種情況完全有效。 本地#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.

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