Javaにおけるfinalキーワードの使い方を例に挙げて説明する

3016 ワード

1. final variable
final variableは定数であり,一度初期化されると変更できない.

class Test1 {
 final double PI = 3.14; //         

 public Test1(){
  PI = 3.14;
 }

  void test(){
   System.out.println("PI is: " + PI);
  }

 public static void main(String[] args){
  Test1 t = new Test1();
  t.test();
 }
}


出力:

PI is: 3.14

(1)Blank final variable
宣言時に初期化されていないfinal variableはblank final variableと呼ばれ、blank final variableはコンストラクション関数で初期化されなければならない.そうしないとコンパイルエラーが投げ出される.

class Test1 {
 final double PI;

 Test1(){
 PI = 3.14; //         
 }

  void test(){
   System.out.println("PI is: " + PI);
  }

 public static void main(String[] args){
 Test1 t = new Test1();
 t.test();
 }
}


出力:

PI is: 3.14

(2)Uninitialized static final variable
宣言フェーズで初期化されていないstatic final variableは、静的コードブロックでのみ初期化できます.

class Test1 {
 static final double PI;

 static {
 PI = 3.14;
 }

  void test(){
   System.out.println("PI is: " + PI);
  }

 public static void main(String[] args){
 Test1 t = new Test1();
 t.test();
 }
}


出力:

PI is: 3.14

2. final method
final methodは上書きできません.すなわち、サブクラスは親クラスのfianl methodを呼び出すことができますが、上書きすることはできません.

class Test {
 static final double PI = 3.14;

  final void test(){
   System.out.println("PI is: " + PI);
  }
}

class Test1 extends Test{

 public static void main(String[] args){
 Test1 t = new Test1();
 t.test();
 }
}


出力:

PI is: 3.14

3. final class
义齿

final class Test1 {
 static final double PI = 3.14;

  final void test(){
   System.out.println("PI is: " + PI);
  }

 public static void main(String[] args){
 Test1 t = new Test1();
 t.test();
 }
}


出力:

PI is: 3.14

PS:java.lang.Stringクラスはなぜfinalに設計されたのですか?まず、finalというキーワードをはっきりさせなければなりません.finalの出現は変えたくないためで、変えたくない理由は2つあります:設計あるいは効率.final修飾のクラスは継承できないのでfinal修飾のクラスは改ざんできない.この点を理解して、(1)設計上、Aは、サブクラスで意味を変更しないことを確保する.Stringクラスはfinalクラスであり、Stringのサブクラスを誰も定義できないことを意味します.すなわち、Stringの参照がある場合、他のクラスのオブジェクトではなくStringオブジェクトを参照します.B、Stringが作成されると修正できません.javaデザイナーがStringを共有できるようにするためです.次の段落はソースコードの注釈です.(2)効率的に言えば、A、finalとして設計されているので、JVMは関連メソッドを虚関数表で照会することなく、Stringクラスの関連メソッドに直接位置決めし、実行効率を向上させます.B、Javaデザイナーは共有がもたらす効率が高いと考えている.要するにjavaを保証することです.lang.Stringが参照するオブジェクトはjavaに違いない.lang.Stringのオブジェクトは、子孫クラスを参照するのではなく、効率と安全を保証します.