Java学習のfinalキーワード

3236 ワード

  • finalデータ
  • 定数:基本データ型、final修飾、定義時に値を割り当てる必要があります.
  • コンパイル期間定数
  • あるデータがfinalであるからといって、コンパイル時にその値を知ることができるとは思えない.例えば、public final int a = rand.nextInt(20);
  • Javaは「空白finalドメイン」の生成を許可し、空白finalとはfinalと宣言されたが初期値が与えられていないドメインを指す.
  • 初期化方式:fianlをドメインの定義または各コンストラクタで式で割り当てる必要がある
  • finalパラメータ:Javaは、パラメータリストでパラメータをfinalとして宣言することを許可します.パラメータリファレンスが指すオブジェクトは、メソッドでは変更できません.

  • finalメソッド
  • finalメソッドを使用する理由
  • メソッドをロックし、継承クラスがその意味を変更し、上書きされないことを禁止します.
  • 効率(無視、早起きバージョン適用)
  • finalおよびprivateキーワード
  • クラスのすべてのprivateメソッドは、finalとして暗黙的に指定されます.privateメソッドを使用、上書きできません.
  • 特別な場合:以下のf()メソッドは上書きではなく新しいメソッドを作成します.


  • class WithFinals {
        private final void f() {
            System.out.println("WithFinals.f()");
        }
        private void g() {
            System.out.println("WithFinals.g()");
        }
    }
    
    class OverridingPrivate extends WithFinals {
        private final void f() {
            System.out.println("OverringPrivate.f()");
        }
        private void g() {
            System.out.println("OverrringPrivate.g()");
        }
    }
    
    class OverridingPrivate2 extends OverridingPrivate {
        public final void f() {
            System.out.println("OverringPrivate2.f()");
        }
    
        public void g() {
            System.out.println("OverringPrivate2.g()");
        }
    }
    public class FinalOverridingIllusion {
        public static void main(String[] args) {
            OverridingPrivate2 op2 = new OverridingPrivate2();
            op2.f();
            op2.g();
            OverridingPrivate op = op2;
            WithFinals wf = op2;
    
        }
    }
  • finalクラス
  • finalクラスのすべてのメソッドは、finalとして暗黙的に指定された
  • です.
  • を継承できません.