Frage

ist dies in Java erlaubt:

for(int i=0;i<5;i++){
  final int myFinalVariable = i;
}

Das Schlüsselwort meiner Frage ist final. Ist es erlaubt eine endgültige Variable zu tun, die mit jedem Durchlauf der Schleife ändert? Ich habe mich gefragt, weil endgültige sagt, dass Sie nicht den Wert der Variablen ändern kann (Aufruf nur myFinalVariable = i), aber ich bin die ganze Variable mit final int neu zu definieren.

Sind sie zwei völlig verschiedene Variablen nur mit dem gleichen Namen - mit den Variablen aus der vorherige Ausführung der Schleife bereits den Weg zum Garbage Collector hinunter

War es hilfreich?

Lösung

Ja, es ist erlaubt. Das final Schlüsselwort bedeutet, dass Sie nicht den Wert der Variablen ändern können in ihrem Anwendungsbereich . Für Ihre Schleife Beispiel können Sie denken an den Variable am Ende der Schleife außerhalb des Gültigkeitsbereiches gehen, dann mit einem neuen Wert am oberen Ende der Schleife zurück in Anwendungsbereich fallen. Zuweisen der Variablen innerhalb der Schleife wird nicht funktionieren.

Andere Tipps

Sie sind für jede Iteration in der Schleife rechts, können Sie eine neue Variable erstellen. Die Variablen tun den gleichen Namen, aber das ist in Ordnung, weil sie nicht im gleichen Umfang ist. Nächstes Beispiel würde nicht Arbeit:

final int myFinalVariable = 0;
for(int i=0;i<5;i++){
  myFinalVariable = i;
}

Eine Variable ist nur ein Standort auf dem Stapel. Versuchen Sie, und halten Sie Ihre Variablen mit so geringen Umfang wie möglich und versuchen, sie endgültig zu machen. Allerdings Umfang und endgültig sind nur Quellcode Dinge ... von einer Code-Generierung / VM Sicht sie nicht wirklich egal.

In Ihrem speziellen Beispiel mit „int“ kein Müll entsteht. Allerdings, wenn es wurden Objekte erstellt dann für beide Fälle die Menge an Müll und wenn der Müll für die Bereinigung berechtigt wäre, wäre identisch.

Nehmen Sie den folgenden Code ein:

public class X
{
    public static void main(final String[] argv)
    {
        foo();
        bar();
    }

    private static void foo()
    {
        for(int i=0;i<5;i++)
        {
            final int myFinalVariable = i;
        }
    }

    private static void bar()
    {
        for(int i=0;i<5;i++)
        {
            int myFinalVariable = i;
        }
    }
}

Der Compiler erzeugt identische Bytecode für jede Methode:

public class X extends java.lang.Object{
public X();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   invokestatic    #2; //Method foo:()V
   3:   invokestatic    #3; //Method bar:()V
   6:   return

private static void foo();
  Code:
   0:   iconst_0
   1:   istore_0
   2:   iload_0
   3:   iconst_5
   4:   if_icmpge       15
   7:   iload_0
   8:   istore_1
   9:   iinc    0, 1
   12:  goto    2
   15:  return

private static void bar();
  Code:
   0:   iconst_0
   1:   istore_0
   2:   iload_0
   3:   iconst_5
   4:   if_icmpge       15
   7:   iload_0
   8:   istore_1
   9:   iinc    0, 1
   12:  goto    2
   15:  return

}

Das Hinzufügen einer anderen Methode, die die Variable außerhalb der Schleife geben Sie etwas andere Bytecode aufgrund der Reihenfolge erklärt, dass die Variablen deklariert). Beachten Sie, dass diese Version der Variablen nicht endgültig gemacht werden können. Diese letzte Version ist nicht die beste Art und Weise (die letzte Variable in der Schleife ist die beste, wenn Sie es tun können):

private static void car()
{
    int myFinalVariable;

    for(int i=0;i<5;i++)
    {
        myFinalVariable = i;
    }
}

private static void car();
  Code:
   0:   iconst_0
   1:   istore_1
   2:   iload_1
   3:   iconst_5
   4:   if_icmpge       15
   7:   iload_1
   8:   istore_0
   9:   iinc    1, 1
   12:  goto    2
   15:  return

}

Wie antwortet Ja, Sie können in der Tat die Variablen in einer Schleife als ‚endgültig‘ markieren. Hier ist die Wirkung, dies zu tun (Java 7 Eclipse Indigo, Mac OS X Lion).

for ( int i = 0; i < 5; i++ ) {

  // With 'final' you cannot assign a new value.
  final int myFinalVariable = i;  // Gets 0, 1, 2, 3, or 4 on each iteration.
  myFinalVariable = 7; // Compiler error: The final local variable myFinalVariable cannot be assigned.

  // Without 'final' you can assign a new value.
  int myNotFinalVariable = i;  // Gets 0, 1, 2, 3, or 4 on each iteration.
  myNotFinalVariable = 7; // Compiler is OK with re-assignment of variable's value.

}

Variable innerhalb der Schleife deklariert hat, den Umfang nur bis zur einzigen Ausführung der Schleife.

Deklarieren Sie die Variable als final innerhalb der Schleife die Schleife die keinen Unterschied für die Variable in Seite macht, aber wenn wir die Variable außerhalb der Schleife mit der endgültigen Modifikator dann wird der Wert zugewiesen Urtyp oder Objekt zugeordnet auf die Referenzvariable deklarieren kann nicht geändert werden.

Im folgende Beispiel gibt es kein Problem mit den ersten beiden Schleifen sowohl die Schleifen gleichen Ausgang geben, aber die dritte Schleife gibt eine Kompilierung Fehler.

public class Test {

public static void main(String[] args) {
    for (int i = 0; i < 5; i++) {
        final int j= i;
        System.out.println(j);
    }
    for (int i = 0; i < 5; i++) {
        int j= i;
        System.out.println(j);
    }

    final int j;
    for (int i = 0; i < 5; i++) {
        j= i;
        System.out.println(j);
    }
}

}

Bitte korrigiert mich wenn ich falsch bin.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top