2016-04-04 12 views
2

In Java können wir ein final Feld in Konstruktoren sowohl in der Basisklasse und seinen Unterklassen als auch in einem Inline-Initialisierungsblock in der Basisklasse initialisieren. Es scheint jedoch, dass wir final Felder in einem Inline-Initialisierungsblock in einer Unterklasse nicht initialisieren können. Dieses Verhalten betrifft hauptsächlich anonyme Klassen, von denen super Konstruktoren nicht aufgerufen werden können.Gibt es eine Möglichkeit, das letzte Feld in der anonyme Klasse zu initialisieren?

abstract class MyTest { 

    final protected int field; 

    public MyTest() { 
     // default value 
     field = 0; 
    } 

} 

MyTest anonymTest = new MyTest() { 
    { 
     // Error: The final field MyTest.field cannot be assigned 
     field = 3; 
    } 
}; 

Gibt es eine Möglichkeit, um eine geerbte final Feld in einer anonymus Klasse zu initialisieren?

Kommentar: Diese Frage bezieht sich nicht auf Konstruktoren, sondern auf die Initialisierung des endgültigen Feldes.

+0

Es geht nicht um den Bau, sondern um letzte Feld Initialisierung. –

+0

Wahr, aber die * einzige * Situation, in der Sie in der Lage sind, ein 'final' Feld von einer Unterklasse zu setzen, ist durch einen Superkonstruktor. Dieses Duplikat deckt also die einzig gültige Situation für Ihre Frage ab. – resueman

+0

Ich stimme nicht zu. Wenn es keinen anderen Weg als den Konstruktor gibt, dann ist dies die Antwort auf die Frage. –

Antwort

1

Letzte Instanzvariablen müssen in einem Konstruktor initialisiert werden.

5

Sie müssen die letzten Instanzvariablen entweder während der Deklaration oder im Konstruktor initialisieren. Sie können jedoch den Wert der an den Konstruktor bieten

abstract class MyTest { 

    final protected int field; 

    public MyTest() { 
     // default value 
     this(0); 
    } 

    public MyTest(int f) { 
     field = f; 
    } 

} 


MyTest anonymTest = new MyTest(3) { 
}; 

aktualisieren: hinzugefügt Konstruktor für Standardwert mit