Es gibt zwei Fälle, die ich bin mir dessen bewusst, wenn lokale # 0 bezieht sich nicht auf this
:
- In statischen Methoden, wie @JonSkeet dokumentiert.
- In Instanzmethoden, bei denen lokale # 0 durch einen anderen Wert überschrieben wurde.
Der zweite Fall ist absolut gültig. Die lokale # 0 wird nur beim Zugriff auf eine Instanzmethode auf this
verwiesen. Innerhalb der Methode gibt es nichts inhärent "Spezielles" über Slot # 0; es kann wie jeder andere Slot (wieder) geschrieben werden (wie auch diejenigen, die von formalen Parametern verwendet werden). Betrachten Sie das folgende Beispiel in Jasmin Format:
.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
In HelloWorld/<init>()V
wir lokale # 0 mit einer konstanten Zeichenfolge überschreiben. Somit lädt die zweite Verwendung von aload_0
einen anderen Wert als einen this
Zeiger. Es ist nicht ungewöhnlich, dass sich derselbe lokale Slot an verschiedenen Stellen im Code auf verschiedene "konzeptionelle" Variablen bezieht, insbesondere wenn eine Klasse durch einen Bytecode-Optimierer durchlaufen wurde.
Also, als Antwort auf Ihre Frage: Ja, es gibt mindestens ein anderes Gegenbeispiel.
Darf ich wissen, was ist '0. lokale Variable'? –
@ sᴜʀᴇsʜᴀᴛᴛᴀ fragt er nach Bytecode, nicht nach Quellcode. – dst