ホームページ >Java >&#&チュートリアル >Java Final を詳しく見る

Java Final を詳しく見る

巴扎黑
巴扎黑オリジナル
2017-05-21 14:10:461272ブラウズ

この記事では、エディターが Java Final を紹介します。必要な友人はそれを参照してください。

JAVA キーワードの Final は、通常、データが変更できないことを意味する「変更不可能」を意味します。メソッドをオーバーライドしたり、クラスを継承したりすることはできません。通常、final を使用する理由は 2 つあります。それは、デザインと効率です。 JAVA バージョンが更新されると、一部の効率の問題はコンパイラーと JVM によって処理できるようになります。したがって、効率の問題を解決するために Final を使用することはそれほど重要ではありません。

Final 修飾子は、主に基本データ型または不変クラスのフィールドで使用されます (クラス内のすべてのメソッドがそのオブジェクトを変更しない場合、このクラスは不変クラスです。文字列は不変クラスです。型を変更します)。

【最終データ】

Final キーワードを使用してデータを変更する場合は、主に 2 つの状況があります:

1. コンパイル時定数

2. 実行時に初期化される値

これは静的ドメインです (慣例に従って、コンパイル時の定数はすべて大文字で名前が付けられ、各単語はアンダースコアで区切られます)。これは変更できない記憶域のみを占有します。コンパイラは、コンパイル時定数を使用する計算式に置き換えることができます。つまり、計算式はコンパイル時に実行できるため、実行時の負担が比較的軽減されます。コンパイル時定数には、定義時に値が割り当てられている必要があります (基本型である必要はありません)。

基本型の場合、値は変更不可になります。オブジェクト参照の場合、値は変更不可になります。つまり、オブジェクト自体は変更できます。オブジェクトでもある配列にも適用できます)。

コードは次のとおりです:

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]);
    }
}

【未割り当てのfinalフィールド】

JAVAでは未割り当てのfinalフィールドを生成できますが、最終フィールドはフィールドの定義時または各コンストラクターで割り当てる必要があります(フィールドの数はいくつあります)。コンストラクターは、使用前に初期化されていることを確認するために、複数回割り当てる必要があります。このようにして、final は不変の特性を維持しながら、同じクラス内で異なるオブジェクトに異なる値を割り当てることができます。

コードは次のとおりです:

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();
    }
}

[最終メソッド]

最終メソッドを使用する理由は 2 つあります。1 つはメソッドをロックして上書きされないようにし、メソッドの動作が継承中に変更されないようにするためです。 ; もう 1 つは、メソッド呼び出しをインライン化してメソッド呼び出しのオーバーヘッドを削減することです。ただし、最近のバージョンでは、JVM 自体が最適化できるため、効率の問題に対処するために Final メソッドを使用する必要はありません。

Final メソッドについては、もう 1 つ注意すべき点があります。クラス内のすべてのプライベート メソッドは暗黙的に Final メソッドとして指定されます (最終的な変更を追加することもできますが、意味はありません)。プライベート メソッドをオーバーライドしようとしても、コンパイラはエラーを報告しませんが、実際にはメソッドを上書きするのではなく、新しいメソッドを生成するだけです。プライベート メソッドは外部クラスからアクセスできないため、当然ながらオーバーライドできません。

上記の問題を防ぐには、@Override アノテーションを使用します。プログラムに示すように:

コードは次のとおりです:

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();
    }
}

[final class]

Final クラスの使用は通常、設計上の理由からであり、このクラスを継承することはできません。これにより、クラスの動作が変更されなくなり、セキュリティ上のリスクも回避できる可能性があります。 Final クラス内のすべてのメソッドは暗黙的に最終メソッドとして指定されているため、オーバーライドできません (最終クラスは継承を禁止しているため、そのクラス内のメソッドはオーバーライドできません)。 Java コア API には、java.lang.String など、final を適用する例が多数あります。 length()などのメソッドの上書きを防ぐため、Stringクラスにfinalを指定します。

final フィールドについては、クラスが Final として宣言されていても、クラス内のフィールドは自動的に Final フィールドにはなりません。

コードは次のとおりです:

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);
    }
}

以上がJava Final を詳しく見るの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。