Heim  >  Artikel  >  Java  >  Tauchen Sie ein in Java Final

Tauchen Sie ein in Java Final

巴扎黑
巴扎黑Original
2017-05-21 14:10:461216Durchsuche

In diesem Artikel stellt der Herausgeber Java Final allen vor. Freunde in Not können sich darauf beziehen

Das JAVA-Schlüsselwort final wird zum Ändern von Daten, Methoden oder Klassen verwendet, was normalerweise „kann nicht geändert werden“ bedeutet " , Daten können nicht geändert werden, Methoden können nicht überschrieben werden und Klassen können nicht vererbt werden. Im Allgemeinen gibt es zwei Gründe für die Verwendung von final: Design und Effizienz. Da die JAVA-Version aktualisiert wird, können einige Effizienzprobleme vom Compiler und der JVM gelöst werden. Daher ist die Verwendung von final zur Lösung von Effizienzproblemen nicht so wichtig.

Der letzte Modifikator wird hauptsächlich in den Feldern primitiver Datentypen oder unveränderlicher Klassen verwendet (wenn alle Methoden in der Klasse ihr Objekt nicht ändern, ist diese Klasse eine unveränderliche Klasse. String ist eine unveränderliche Klasse).

[endgültige Daten]

Es gibt zwei Hauptsituationen, in denen das Schlüsselwort Final zum Ändern von Daten verwendet wird:

1 Kompilierungszeitkonstanten

2 . Laufzeitinitialisierung Der Wert von

für Konstanten zur Kompilierungszeit bezieht sich auf ein Feld, das sowohl endgültig als auch statisch ist (gemäß der Konvention werden Konstanten zur Kompilierungszeit alle mit Großbuchstaben benannt und verwenden Unterstriche, um die einzelnen Wörter zu trennen). , der nur einen Abschnitt einnimmt, der nicht geändert werden kann. Der Compiler kann Konstanten zur Kompilierungszeit in jede Berechnungsformel ersetzen, die ihn verwenden kann. Das heißt, die Berechnungsformel kann zur Kompilierungszeit ausgeführt werden, was die Laufzeitbelastung relativ reduziert. Einer Kompilierzeitkonstante muss bei der Definition ein Wert zugewiesen werden (nicht unbedingt ein Basistyp).

Für Basistypen macht final den Wert unveränderlich; für Objektreferenzen macht final die Referenz unveränderlich, das heißt, sie kann nicht geändert werden, um auf ein anderes Objekt zu verweisen geändert (gilt für Arrays, die auch Objekte sind).

Der Code lautet wie folgt:

public class javaFinalData{
    private static final String TESTD = "test";
    public static final String TESTE = "test";
    public static final String[] TESTF = {"1","2"}; //非基本类型
    private static final String[] TESTG = new String[2];
    public static void main(String args[]){
        final int testA = 1;
        final String testB = "test";
        final int[] testC = {1,1,2,};
        System.out.println(testC[1]);
        testC[1] = 123;
        System.out.println(testC[1]);
    }
}

[Nicht zugewiesenes Endfeld]

JAVA ermöglicht die Generierung nicht zugewiesener Endfelder, diese müssen jedoch vorhanden sein das Feld Weisen Sie das letzte Feld bei der Definition oder in jedem Konstruktor zu (so viele Konstruktoren wie es gibt), stellen Sie sicher, dass es vor der Verwendung initialisiert wird. Auf diese Weise kann final flexibler verwendet werden. In derselben Klasse können verschiedenen Objekten unterschiedliche Werte zugewiesen werden, während unveränderliche Eigenschaften erhalten bleiben.

Der Code lautet wie folgt:

public class javaBlankFinal{
    private final int blank;
    public javaBlankFinal(){
        blank = 2011;
    }
    public javaBlankFinal(int temp){
        blank = 2012;
    }
    public javaBlankFinal(String temp){
        blank = 2014;
    }
    public static void main(String args[]){
        new javaBlankFinal();
    }
}

[endgültige Methode]

Es gibt zwei Gründe für die Verwendung der endgültigen Methode: Einer besteht darin, die Methode zu sperren Um zu verhindern, dass das Methodenverhalten während der Vererbung unverändert bleibt, werden Methodenaufrufe in Inlining-Aufrufe umgewandelt (Inlining), um die Kosten für Methodenaufrufe zu senken. In neueren Versionen kann sich die JVM jedoch selbst optimieren, sodass keine endgültigen Methoden zur Lösung von Effizienzproblemen erforderlich sind.

Zur finalen Methode gibt es noch etwas zu beachten: Alle privaten Methoden in der Klasse werden implizit als finale Methoden bezeichnet (Sie können ihnen auch finale Änderungen hinzufügen, dies ist jedoch bedeutungslos). Wenn Sie versuchen, eine private Methode zu überschreiben, meldet der Compiler keinen Fehler, aber tatsächlich überschreiben Sie die Methode nicht, sondern generieren lediglich eine neue Methode. Da externe Klassen nicht auf die private Methode zugreifen können, kann sie natürlich nicht überschrieben werden.

Verwenden Sie die Annotation @Override, um die oben genannten Probleme zu verhindern. Wie im Programm gezeigt:

Der Code lautet wie folgt:

class finalFunction{
    private void finalFunctionA(){
        System.out.println("finalFunctionA");
    }

    private final void finalFunctionB(){
        System.out.println("finalFunctionB");
    }

    final void finalFunctionC(){
        System.out.println("finalFunctionC");
    }

    void functionD(){}
}
class overrideFinalFunction extends finalFunction{
    //@Override   添加@Override注解可以识别是否是override
    public void finalFunctionA(){               
        System.out.println("override finalFunctionA");
    }

    public final void finalFunctionB(){
        System.out.println("override finalFunctionB");
    }

    //final void finalFunctionC(){}   //Cannot override the final method from finalFunction

    @Override   
    void functionD(){} //真正的override方法
}
public class javaFinalFunction extends finalFunction{
    public static void main(String args[]){
        finalFunction ff = new finalFunction();
        //ff.finalFunctionA();  //无法调用private方法
        //ff.finalFunctionB();

        overrideFinalFunction off = new overrideFinalFunction();
        off.finalFunctionA();   //public方法
        off.finalFunctionB();
    }
}

[Abschlussklasse]

Die Verwendung der Abschlussklasse dient im Allgemeinen dem Design Gründe, nicht Erlauben Sie die Vererbung dieser Klasse. Dadurch wird sichergestellt, dass sich das Verhalten der Klasse nicht ändert, und möglicherweise werden auch einige Sicherheitsrisiken vermieden. Alle Methoden in der Final-Klasse werden implizit als Final-Methoden bezeichnet und können daher nicht überschrieben werden (da die Final-Klasse die Vererbung verbietet, können Methoden in ihrer Klasse nicht überschrieben werden). In der Java-Kern-API gibt es viele Beispiele für die Anwendung von final, z. B. java.lang.String. Geben Sie final für die String-Klasse an, um das Überschreiben von Methoden wie length() zu verhindern.

Bei finalen Feldern werden die Felder in der Klasse nicht automatisch zu finalen Feldern, selbst wenn eine Klasse als final deklariert wird.

Der Code lautet wie folgt:

final class finalClass{
    int testA = 2011;
}
//class extendFinalClassextends finalClass{}  //can not extendthe final class finalClass
public class javaFinalClass{
    public static void main(String args[]){
       finalClass fc = new finalClass();
       System.out.println(fc.testA);
       fc.testA = 2012;
       System.out.println(fc.testA);
    }
}

Das obige ist der detaillierte Inhalt vonTauchen Sie ein in Java Final. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn