In Java wird das endgültige Schlüsselwort verwendet, um zu erklären, dass das Objekt unveränderlich ist. Die hier enthaltenen Objekte enthalten Variablen, Methoden und Klassen, die dem CONT -Schlüsselwort in C ++ ähnlich sind.
Unveränderliche bedeutet, dass nach dem Erstellen des Objekts der Zustand nicht geändert werden kann. Sie können das endgültige Schlüsselwort aus drei Perspektiven verwenden:
endgültige Variable
Definieren Sie das endgültige Objekt A, dann kann A nur einmal initialisiert werden. Nach der Initialisierung können die Daten von A nicht geändert werden. Wenn a ein Referenztyp ist, können andere Objekte nicht wiedergegeben werden.
Die endgültige Variable, die nicht initialisiert wird, wird als leer als endgültig bezeichnet. Wenn es sich um eine Mitgliedsvariable handelt, muss sie im Konstruktor initialisiert oder zugeordnet werden.
Beispiel:
Klassenkreis {statische endgültige Doppel PI = 3,1415926; endgültiger int radius = 5; endgültige int xpos; endgültige int ypos; public circle (int x, int y) {xpos = x; ypos = y; }} Letzte Methode
Wenn Sie die endgültige Methode definieren, kann die Methode nicht überladen werden. Der Methodendesigner möchte, dass andere verwandte Funktionen aufgrund der Überlastung der Methode nicht auftreten.
Beispiel:
Klasse BaseClass {public Final void method () {}} Klasse DerivedClass erweitert BaseClass {public Final Void Method () {} // Kompilierungsfehler}Es ist zu beachten, dass die Definition der endgültigen Methode möglicherweise nicht unbedingt den Effekt von Inline erzeugt, da die Inline -Methode von der Strategie des JVM und nicht vom endgültigen Schlüsselwort abhängt, ist es ungenau, die Effizienz der Methode durch endgültiges Design zu verbessern.
letzte Klasse
Die durch die endgültige Klasse X definierte endgültige Klasse X kann nicht vererbt werden.
In Java ist die String -Klasse als endgültig gestaltet und ihre Definition lautet wie folgt
Die Codekopie lautet wie folgt:
öffentliche Klasse Final String erweitert Objekt implementiert serialisierbare, vergleichbare <string>, charsequence
Interne Klasse und endgültig
Bei der Definition der anonymen inneren Klasse in einer Methode kann die innere Klasse nur auf endgültige Typvariablen in der Methode zugreifen, damit der Java -Compiler den Wert der Variablen im Voraus erfassen und eine Kopie in der inneren Klasse speichern kann. Wenn die Methode zerstört wird, ist der Speicherraum der inneren Klasse noch vollständig.
Beispiel:
public class wrack {public static void main (String [] args) {// Objekt obj = null; // Fehler erfassen endgültig Objekt obj = null; neuer Thread (new Runnable () {public void run () {obj = "hello";}}). start (); }} PS: Stellen Sie aus, dass die interne anonyme Klasse auf externe Nicht-Final-Variablen nicht zugreifen kann
Das klingt ein bisschen schwer zu sprechen, aber in der Tat möchte ich mehr über einige Funktionen von Java -internen Klassen sprechen.
Der Grund, warum ich an diese Frage denke, ist, dass beim Lesen des Code über HTTP Keepalive im JDK -Quellcode kürzlich eine der Quelldateien sun.net.www.protocol.http.httpurlConnection.java versehentlich den folgenden Code gesehen hat.
Finale boolesche Ergebnis [] = {false}; a1.equals (a2);Die anonymen internen Klassen von Java können nicht auf Nicht-Finale-Variablen der entsprechenden Funktion zugreifen. Um auf externe lokale Variable zuzugreifen, muss diese Variable zuerst als FIANL definiert werden. Sobald es jedoch als endgültig definiert ist, kann der Wert dieser Variablen nicht in einer anonymen internen Klasse geändert werden. Daher ist es nicht so einfach, einige nützliche Werte in einer anonymen internen Klasse zurückzugeben. Dieser Code verwendet eine sehr clevere Methode, wobei hier Arrays diese Einschränkung umgehen. Obwohl wir den Verweis auf das variable Ergebnis nicht ändern können, können wir den Inhalt des Arrays durch Ergebnis ändern.
Ich möchte nur einen kleinen Trick aufzeichnen, um externe Variablen durch interne anonyme Klassen zu ändern. Aber da Sie hier angekommen sind, können Sie genauso gut weiter sehen, welche Funktionen oder Einschränkungen die internen Klassen haben.
Bevor ich diesen Artikel fortsetze, bin ich der Meinung, dass es sehr notwendig ist, einige der in diesem Artikel verbundenen Java -Begriffe zu klären. Diese Begriffe sind nicht leicht in Chinesisch zu übersetzen, daher werden wir sie immer noch auf Englisch beschreiben.
// Dies ist klassische Klasse Javaterm {// Feld- oder Mitgliedsvariable Private Int Field; // Konstruktor public Javaterm () {} // Methode public void method () {// Lokale variable int localVariable = 0; // Lokale Klasse Klasse LocalClass {public localClass () {}} // Anonymous class New Runnable () {public void run () {}}; }}Heute werden wir uns mehr auf die lokale Klasse und die anonyme Klasse konzentrieren, die beide zur inneren Klasse gehören.
Java erlaubt es uns, eine andere Klasse in einer Klasse, die als verschachtelte Klasse bezeichnet wird, zu definieren, und eine verschachtelte Klasse kann in zwei Kategorien unterteilt werden, eine statische verschachtelte Klasse und die andere ist eine nicht statische verschachtelte Klasse, auch als innere Klasse bekannt. Die innere Klasse kann auch in lokale Klasse und anonyme Klasse unterteilt werden.
Einige Einschränkungen der anonymen Klasse