2014-03-04 6 views
5

In den lokalen Variablen einer Java-Methode, wann wird die 0. lokale Variable nicht auf 'this' verweisen?Java - Wann ist die 0. lokale Variable nicht 'this'?

Ich kann mir statische Methoden als Gegenbeispiel vorstellen, gibt es noch andere?

UPDATE: Ich beziehe mich auf Bytecode

+4

Darf ich wissen, was ist '0. lokale Variable'? –

+1

@ sᴜʀᴇsʜᴀᴛᴛᴀ fragt er nach Bytecode, nicht nach Quellcode. – dst

Antwort

2

Es gibt zwei Fälle, die ich bin mir dessen bewusst, wenn lokale # 0 bezieht sich nicht auf this:

  1. In statischen Methoden, wie @JonSkeet dokumentiert.
  2. 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.

7

Die JVM specification section 2.6.1, dass es nur davon abhängt, scheint zu denken, ob es sich um eine statische (Klassen-) Methode ist oder eine Instanzmethode:

Die Java Virtual Machine verwendet lokale Variablen zum Übergeben von Parametern beim Methodenaufruf. Beim Aufruf der Klassenmethode werden alle Parameter in aufeinanderfolgenden lokalen Variablen beginnend mit der lokalen Variablen 0 übergeben. Beim Instanzmethodenaufruf wird die lokale Variable 0 immer verwendet, um einen Verweis auf das Objekt zu übergeben, auf dem die Instanzmethode aufgerufen wird Programmiersprache). Alle Parameter werden anschließend in aufeinanderfolgenden lokalen Variablen besteht aus lokalen Variable beginnend 1.

Das ist im Hinblick auf den anfänglichen Werte der lokalen Variablen; siehe die Antwort von Mike Strobel für ein Beispiel, in dem es während der Methode explizit geändert wird.

+0

@RahulTripathi: Ich bin mir nicht sicher, was diese Frage überhaupt bedeutet. –

+0

Gibt es einen Verweis auf die JVM-Dokumentation für dieses Verhalten verfügbar? – ErstwhileIII

+0

@JonSkeet: - Ich will nur wissen, was ist 0. lokale Variable? –

Verwandte Themen