Dies ist eine beliebte Interviewfrage . Mit diesen Fragen versucht der Interviewer herauszufinden, wie gut Sie das Verhalten von Objekten in Bezug auf Konstruktoren, Methoden, Klassenvariablen (statische Variablen) und Instanzvariablen verstehen.
import java.util.ArrayList;
import java.util.List;
class Test {
private final List foo;
public Test() {
foo = new ArrayList();
foo.add("foo"); // Modification-1
}
public void setFoo(List foo) {
//this.foo = foo; Results in compile time error.
}
}
Im obigen Fall haben wir einen Konstruktor für 'Test' definiert und ihm eine 'setFoo'-Methode gegeben.
Informationen zum Konstruktor: Der Konstruktor kann nur einmal pro Objekterstellung mithilfe des new
Schlüsselworts aufgerufen werden . Sie können den Konstruktor nicht mehrmals aufrufen, da der Konstruktor nicht dafür ausgelegt ist.
Über die Methode: Eine Methode kann so oft aufgerufen werden, wie Sie möchten (auch nie), und der Compiler weiß es.
Szenario 1
private final List foo; // 1
foo
ist ein Instanzvariable. Wenn wir ein Test
Klassenobjekt erstellen foo
, wird die Instanzvariable in das Objekt der Test
Klasse kopiert . Wenn wir foo
innerhalb des Konstruktors zuweisen , weiß der Compiler, dass der Konstruktor nur einmal aufgerufen wird, sodass es kein Problem gibt, ihn innerhalb des Konstruktors zuzuweisen .
Wenn wir foo
innerhalb einer Methode zuweisen , weiß der Compiler, dass eine Methode mehrmals aufgerufen werden kann, was bedeutet, dass der Wert mehrmals geändert werden muss, was für eine final
Variable nicht zulässig ist. Der Compiler entscheidet also, dass der Konstruktor eine gute Wahl ist! Sie können einer endgültigen Variablen nur einmal einen Wert zuweisen.
Szenario 2
private static final List foo = new ArrayList();
foo
ist jetzt eine statische Variable. Wenn wir eine Instanz einer Test
Klasse erstellen , foo
wird diese nicht in das Objekt kopiert, da sie foo
statisch ist. Jetzt foo
ist nicht eine unabhängige Eigenschaft jedes Objekts. Dies ist eine Eigenschaft der Test
Klasse. Aber foo
kann durch mehrere Objekte zu erkennen und , wenn jedes Objekt , das unter Verwendung des erstellte new
Schlüsselwort , das letztlich das wird aufrufe Test
Konstruktor , die den Wert zum Zeitpunkt der mehrere Objekterstellung ändert (Denken Sie daran , static foo
sich in jedem Objekt nicht kopiert, sondern zwischen mehreren Objekten gemeinsam .)
Szenario 3
t.foo.add("bar"); // Modification-2
Oben Modification-2
ist von Ihrer Frage. Im obigen Fall ändern Sie nicht das erste referenzierte Objekt, sondern fügen Inhalte hinzu, foo
die zulässig sind. Der Compiler beschwert sich, wenn Sie versuchen new ArrayList()
, der foo
Referenzvariablen a zuzuweisen .
Regel Wenn Sie eine final
Variable initialisiert haben , können Sie sie nicht so ändern, dass sie auf ein anderes Objekt verweist. (In diesem Fall ArrayList
)
Finale Klassen können nicht unterklassiert werden
final Methoden außer Kraft gesetzt werden kann. (Dieses Verfahren ist in übergeordneter Klasse)
final Methoden überschreiben können. (Lesen Sie dies grammatikalisch. Diese Methode gehört zu einer Unterklasse.)