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 newSchlü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
fooist ein Instanzvariable. Wenn wir ein TestKlassenobjekt erstellen foo, wird die Instanzvariable in das Objekt der TestKlasse kopiert . Wenn wir fooinnerhalb 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 fooinnerhalb 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 finalVariable 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();
fooist jetzt eine statische Variable. Wenn wir eine Instanz einer TestKlasse erstellen , foowird diese nicht in das Objekt kopiert, da sie foostatisch ist. Jetzt fooist nicht eine unabhängige Eigenschaft jedes Objekts. Dies ist eine Eigenschaft der TestKlasse. Aber fookann durch mehrere Objekte zu erkennen und , wenn jedes Objekt , das unter Verwendung des erstellte newSchlüsselwort , das letztlich das wird aufrufe TestKonstruktor , die den Wert zum Zeitpunkt der mehrere Objekterstellung ändert (Denken Sie daran , static foosich in jedem Objekt nicht kopiert, sondern zwischen mehreren Objekten gemeinsam .)
Szenario 3
t.foo.add("bar"); // Modification-2
Oben Modification-2ist von Ihrer Frage. Im obigen Fall ändern Sie nicht das erste referenzierte Objekt, sondern fügen Inhalte hinzu, foodie zulässig sind. Der Compiler beschwert sich, wenn Sie versuchen new ArrayList(), der fooReferenzvariablen a zuzuweisen .
Regel Wenn Sie eine finalVariable 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.)