JAVA キーワードの Final は、データ、メソッド、またはクラスを変更するために使用されます。これは通常「変更不可」、つまりデータは変更できず、メソッドはオーバーライドできず、クラスは継承できないことを意味します。通常、final を使用する理由は 2 つあります。それは、デザインと効率です。 JAVA バージョンが更新されると、一部の効率の問題はコンパイラーと JVM によって処理できるようになります。したがって、効率の問題を解決するために Final を使用することはそれほど重要ではありません。
Final 修飾子は主にプリミティブ データ型または不変クラスのフィールドで使用されます (クラス内のすべてのメソッドがそのオブジェクトを変更しない場合、このクラスは不変クラスです。 String は不変クラスです)。
【最終データ】
データの変更に Final キーワードが使用される主な状況は 2 つあります。
1. コンパイル時定数
2. 実行時に初期化される値
コンパイル時定数の場合、最終フィールドと静的フィールドの両方を参照します (規則に従って、コンパイル時定数はすべて大文字で名前が付けられ、各単語はアンダースコアで区切られます)。変更することはできません。コンパイラは、コンパイル時定数を使用する計算式に置き換えることができます。つまり、計算式はコンパイル時に実行できるため、実行時の負担が比較的軽減されます。コンパイル時定数には、定義時に値が割り当てられている必要があります (基本型である必要はありません)。
実行時に初期化される値の場合、基本型の場合、final は値を変更不可にします。オブジェクト参照の場合、final は参照を変更不可にします。つまり、別のオブジェクトを指すように変更することはできません。ただし、オブジェクト自体は変更できます。 array に適用可能、配列もオブジェクトです)。
プライベート静的最終文字列 TESTD = "テスト";
パブリック静的最終文字列 TESTE = "テスト";
public static Final String[] TESTF = {"1","2"};
プライベート静的最終文字列[] TESTG = 新しい文字列[2];
public static void main(String args[]){
最終 int testA = 1;
最終文字列 testB = "テスト";
最終 int[] testC = {1,1,2,};
System.out.println(testC[1]);
テストC[1] = 123;
System.out.println(testC[1]);
}
}
JAVA では未割り当ての最終フィールドを生成できますが、最終フィールドはフィールドの定義時または各コンストラクター (コンストラクターの数だけ) で割り当てて、使用前に確実に初期化する必要があります。このようにして、final は不変の特性を維持しながら、同じクラス内で異なるオブジェクトに異なる値を割り当てることができます。
public javaBlankFinal(){
空白 = 2011;
}
public javaBlankFinal(int temp){
空白 = 2012;
}
public javaBlankFinal(String temp){
空白 = 2014;
}
public static void main(String args[]){
新しいjavaBlankFinal();
}
}
最終メソッドを使用する理由は 2 つあります。1 つはメソッドをロックしてメソッドが上書きされないようにし、継承中にメソッドの動作が変更されないようにするためです。もう 1 つはメソッドの呼び出しをインライン呼び出しに変換してメソッドのコストを削減するためです。呼び出します。ただし、最近のバージョンでは、JVM 自体が最適化できるため、効率の問題に対処するために Final メソッドを使用する必要はありません。
Final メソッドに関しては、もう 1 つ注意すべき点があります。クラス内のすべてのプライベート メソッドは暗黙的に Final メソッドとして指定されます (最終的な変更を追加することもできますが、意味はありません)。プライベート メソッドをオーバーライドしようとしても、コンパイラはエラーを報告しませんが、実際にはメソッドを上書きするのではなく、新しいメソッドを生成するだけです。プライベート メソッドは外部クラスからアクセスできないため、当然ながらオーバーライドできません。
@Override アノテーションを使用すると、上記の問題を防ぐことができます。プログラムで示されているように:
private Final void FinalFunctionB(){
System.out.println("finalFunctionB");
}
Final void FinalFunctionC(){
System.out.println("finalFunctionC");
}
void functionD(){}
}
class overrideFinalFunction extendsfinalFunction{
//@Override オーバーライドかどうかを識別するために @Override アノテーションを追加します
public void FinalFunctionA(){
System.out.println("finalFunctionA をオーバーライド");
}
public Final void FinalFunctionB(){
System.out.println("finalFunctionB をオーバーライド");
}
//final void FinalFunctionC(){} //finalFunction からの Final メソッドをオーバーライドできません
@オーバーライド
void functionD(){} //実際のオーバーライドメソッド
}
public class javaFinalFunction extends FinalFunction{
public static void main(String args[]){
FinalFunction ff = 新しいfinalFunction();
//ff.finalFunctionA() //プライベートメソッドを呼び出せません
//ff.finalFunctionB();
overrideFinalFunction off = new overrideFinalFunction();
off.finalFunctionA(); //パブリックメソッド
off.finalFunctionB();
}
}
最終クラスの使用は通常、設計上の理由から行われるため、クラスを継承することはできません。これにより、クラスの動作が変更されなくなり、セキュリティ上のリスクも回避できる可能性があります。 Final クラス内のすべてのメソッドは暗黙的に最終メソッドとして指定されているため、オーバーライドできません (最終クラスは継承を禁止しているため、そのクラス内のメソッドはオーバーライドできません)。 Java コア API には、java.lang.String など、final を適用する例が多数あります。 length()などのメソッドの上書きを防ぐため、Stringクラスにfinalを指定します。
Final フィールドの場合、クラスが Final と宣言されていても、クラス内のフィールドは自動的に Final フィールドにはなりません。
パブリック クラス javaFinalClass{
public static void main(String args[]){
FinalClass fc = 新しいfinalClass();
System.out.println(fc.testA);
fc.testA = 2012;
System.out.println(fc.testA);
}
}