ホームページ >Java >&#&チュートリアル >Java 言語 Java での Final の詳細なアプリケーション
Final は Java では一般的には使用されませんが、C 言語で定数を定義するなどの機能を提供します。それだけでなく、final を使用すると、メンバー、メソッド、またはクラスを上書きできるか、継続できるかを制御することもできます。これらの機能が Final になります。 Javaでは欠かせないポジションであり、Javaを学ぶ上で必ず知っておき、習得しなければならないキーワードの一つでもあります。
final member
クラスで変数を定義するときは、その変数の前に Final キーワードを追加します。これは、変数が初期化されると、その値を変更できないことを意味します。型は変更されますが、オブジェクト変数の場合は、その参照を再度変更することはできません。その初期化は 2 つの場所で実行できます。1 つはその定義時、つまり、最終変数が定義されるときに値が直接割り当てられ、もう 1 つはコンストラクター内で行われます。これら 2 つの場所のいずれかを選択できるのは、定義時に値を与えるか、コンストラクターで値を与えるかのいずれかです。定義時に値を与え、同時にコンストラクターで別の値を与えることはできません。次のコードはこれを示しています。アドレス値final int i; System.out.PRintln("I="+b. i+" リスト タイプ:"+b.list.getClass());
b=new Bat(23,new ArrayList());
b.list.add( new Bat());
System.out.println( "I="+b.i+" List Type:"+b.list.getClass());
}
}
このプログラムは、final の通常の使用法を単純に示しています。 。ここでコンストラクターで初期化を使用すると、多少の柔軟性が得られます。 Bat の 2 つのオーバーロードされたコンストラクターに示されているように、最初のデフォルト コンストラクターはデフォルト値を提供し、オーバーロードされたコンストラクターは、提供された値または型に従って最終変数を初期化します。ただし、この柔軟性が必要ない場合もあります。その場合は、このメソッドを使用しないでください。 main メソッドにはコメント化された 2 行のステートメントがあります。コメントを削除すると、プログラムはコンパイルできなくなります。つまり、i の値であってもリストの型であっても、一度初期化すると変更することはできません。 。ただし、出力に示すように、 b を再初期化して i の値またはリストのタイプを指定することができます:
I=100 List Type:class java.util.LinkedList
I=23 List Type:class java.util.ArrayList
もう 1 つの使用法は、メソッド内のパラメーターを Final として定義することです。基本型の変数はメソッド呼び出し時に値によって渡されるため、これには実質的な意味はありません。つまり、このパラメーター変数を変更すると、呼び出し側のステートメントには影響しませんが、オブジェクト変数の場合は、渡すときにその参照が渡されるため、メソッド内のオブジェクト変数の変更は呼び出し側のステートメントにも影響します。メソッド内のパラメータとしてオブジェクト変数を変更する必要はありません。明示的に Final を使用してオブジェクト変数を宣言すると、意図しない変更が呼び出し側メソッドに影響を与えるのを防ぐことができます。
さらに、メソッドの内部クラスがメソッド内のパラメータ変数を使用する場合、次のコードに示すように、パラメータ変数も使用する前に Final として宣言する必要があります。
public class INClass{
void innerClass(最終文字列 str){
クラス IClass{
IClass(){
}}} L iclass IC = New iClass ();
Public Static void Main (String [] ARGS) {
Inclass Inc = New Inclss (); }
}
Finalメソッド
メソッドを Final として宣言するということは、このメソッドによって提供される関数が要件を満たしており、拡張する必要がないことがすでにわかっていることを意味します。さらに、このクラスから続くクラスはこのメソッドをオーバーライドすることができません。この方法は引き続き続行できます。つまり、この方法を直接使用できます。インラインと呼ばれるメカニズムもあり、ブレークポイントの保存やスタックのプッシュなど、問題を引き起こす可能性があるルーチンのメソッド呼び出しを行う代わりに、最終メソッドを呼び出すときにメソッド本体を呼び出しポイントに直接挿入できます。これにより、プログラムの効率が向上します。ただし、メソッド本体が非常に大きい場合、またはこのメソッドを複数の場所で呼び出す場合、呼び出し本体のコードが急速に拡張され、効率に影響を与える可能性があるため、注意して使用する必要があります。 Final はメソッドを定義します。
final クラス
final をクラスに使用する場合は、慎重に考える必要があります。final クラスは誰にも継続できないためです。つまり、このクラスは継続ツリーのリーフ クラスであり、このタイプのデザインは完全であるとみなされます。変更や拡張は必要ありません。最終クラスのメンバーについては、最終クラスとして定義するかどうかを定義できます。メソッドに関しては、所属するクラスがfinalなので当然finalになります。最終クラスのメソッドに明示的に Final を追加することもできますが、これは明らかに無意味です。
次のプログラムは、final メソッドと Final クラスの使用法を示しています。
final class Final{
Final String str="final Data";
public String str1="non Final data";
Final public void print(){
System .out.println("final method.");
}
public void what(){
System.out.println(str+"n"+str1);
}
}
public class FinalDemo { //final を拡張できませんcontinue
public static void main(string [] args){
最終クラスは、継続の特性を失うことを除いて、通常のクラスの使用からほとんど違いはありません。最終メソッドと非最終メソッドの違いもプログラム行からはわかりにくいため、注意して使用するようにしてください。
デザインパターンへのfinalの応用
デザインパターンにはimmutabilityパターンと呼ばれるパターンがあり、finalキーワードを使用することでJavaで簡単に実装することができます。これに興味がある場合は、Yan Hon 博士の著書「Java and Patterns」の説明を参照してください。
ここまで、this、static、super、finalの使い方を説明してきましたが、この4つのキーワードの違いと使い方が大まかに分かれば、ほぼマスターしたことになります。ただし、世の中に完璧なものはありません。Java にはこれら 4 つのキーワードが用意されており、プログラマーのプログラミングに大きな利便性をもたらしますが、プログラムを悪用すると逆効果になるため、どこでもこれらを使用する必要があるというわけではありません。それを使って。
上記は Java における Java 言語の詳細な応用です。その他の関連記事については、PHP 中国語 Web サイト (www.php.cn) に注目してください。