1. endgültige Variable
Die endgültige Variable ist eine Konstante, die nach der Initialisierung nicht geändert werden kann.
Klasse test1 {Final Double Pi = 3,14; // Der Name der Konstante wird am besten aktiviert public test1 () {pi = 3.14; } void test () {System.out.println ("pi ist:" + pi); } public static void main (String [] args) {test1 t = new Test1 (); t.test (); }} Ausgabe:
Pi ist: 3.14
(1) leere endgültige Variable
Die endgültige Variable, die zum Zeitpunkt der Deklaration nicht initialisiert wird, wird als leere endgültige Variable bezeichnet. Die leere endgültige Variable muss im Konstruktor initialisiert werden, andernfalls wird ein Kompilierungsfehler geworfen.
Klasse test1 {Final Double Pi; Test1 () {pi = 3.14; // Initialisieren im Konstruktor} void test () {System.out.println ("pi ist:" + pi); } public static void main (String [] args) {test1 t = new Test1 (); t.test (); }} Ausgabe:
Pi ist: 3.14
(2) nicht initialisierte statische endgültige Variable
Die statische endgültige Variable, die während der Deklarationsphase nicht initialisiert wird, kann nur in statischen Codeblöcken initialisiert werden.
Klasse test1 {statische endgültige Doppel -Pi; static {pi = 3.14; } void test () {System.out.println ("pi ist:" + pi); } public static void main (String [] args) {test1 t = new Test1 (); t.test (); }} Ausgabe:
Pi ist: 3.14
2. Schlussmethode
Die endgültige Methode kann nicht überschrieben werden. Das heißt, eine Unterklasse kann die FIANL -Methode der übergeordneten Klasse aufrufen, kann sie aber nicht überschreiben.
Klassentest {statische endgültige doppelte pi = 3,14; endgültig void test () {System.out.println ("pi ist:" + pi); }} class test1 erweitert test {public static void main (String [] args) {test1 t = new Test1 (); t.test (); }} Ausgabe:
Pi ist: 3.14
3. Finale Klasse
endgültige CALs können nicht vererbt werden
endgültige Klasse test1 {statische endgültige Doppel Pi = 3,14; endgültig void test () {System.out.println ("pi ist:" + pi); } public static void main (String [] args) {test1 t = new Test1 (); t.test (); }} Ausgabe:
Pi ist: 3.14
PS: Warum ist die Java.lang.String -Klasse als endgültig gestaltet?
Zunächst müssen Sie sich über das Keyword -Finale klar machen.
Das Finale scheint sich nicht zu ändern, aber es gibt zwei Gründe dafür, sich nicht zu ändern: Design oder Effizienz. Die durch das Finale modifizierte Klasse kann nicht geerbt werden, sodass die durch das Finale modifizierte Klasse nicht manipuliert werden kann.
Lassen Sie uns nach dem Verständnis einen Blick auf das Problem werfen:
(1) Aus Designperspektive,
A. Stellen Sie sicher, dass sie die Semantik in Unterklassen nicht ändern. Die String -Klasse ist eine endgültige Klasse, was bedeutet, dass niemand eine Unterklasse einer Zeichenfolge definieren darf. Mit anderen Worten, wenn es eine String -Referenz gibt, muss es sich auf ein String -Objekt beziehen, aber es kann kein Objekt anderer Klassen sein.
B. String kann nicht geändert werden, sobald er erstellt wurde, da der Java -Designer die Zeichenfolge freigibt. Der folgende Absatz ist ein Kommentar im Quellcode:
(2) Aus der Sicht der Effizienz:
A. Als endgültig entwickelt, muss der JVM keine Methoden in der virtuellen Funktionstabelle abfragen, sondern befindet sich direkt in den damit verbundenen Methoden der String -Klasse, wodurch die Ausführungseffizienz verbessert wird.
B. Java -Designer glauben, dass das Teilen mehr Effizienz bringt.
Kurz gesagt, es ist notwendig sicherzustellen, dass das von Java.lang.String verwiesene Objekt ein Objekt von Java.lang.String sein muss, nicht um eine Klasse, die auf seine Nachkommen verweist, um seine Effizienz und Sicherheit zu gewährleisten.