この記事では、主にjava finalキーワードの使用法を紹介し、誰もがJavaをよりよく理解して使用できるようにします。興味のある友人は、Javaキーワードfinalの意味がコンテキストによってわずかに異なることを理解でき
ますが、通常は「これはできません。変更される」。変更を防ぐ理由は2つあります。設計と効率です。これらの2つの理由は大きく離れているため、キーワードfinalを誤用する可能性があります。
次のセクションでは、finalの3つの可能な使用法、データ、メソッド、およびクラスについて説明します。
1)最終データ
コンパイル時定数の場合、コンパイラーは定数を計算に組み込むことができるため、実行時の負担を軽減できます。Javaでは、このような定数は基本型である必要があり、キーワードfinalで変更されます。定数を定義するときに値を割り当てる必要があります。
初期値が一定の最終的な静的基本変数(つまり、コンパイル時定数)はすべて大文字で名前が付けられ、単語はアンダースコアで区切られます。
staticとfinalの両方で変更された属性は、変更できないストレージスペースのセクションのみを占有します。
基本型の代わりにfinalを使用してオブジェクト参照を装飾する場合、
- 基本タイプの場合、finalは値を一定に保ちます。
- オブジェクト参照の場合、finalは参照を定数にします。
参照がオブジェクトを指すように初期化されると、他のオブジェクトを指すように変更することはできません。ただし、オブジェクト自体は変更可能であり、Javaはオブジェクトを定数として設定するメソッドを提供していません。(オブジェクトを一定にする効果を実現するために独自のクラスを作成できます)この制限は、オブジェクトでもある配列にも適用されます。
例:
import java.util.*;
class Value {
int i;
Value(int i) {
this.i = i;
}
}
/**
* @author Limh
*/
public class FinalData {
private static Random rand = new Random(47);
private String id;
public FinalData(String id) {
this.id = id;
}
private final int valueOne = 9;
private static final int VALUE_TWO = 99;
public static final int VALUE_THREE = 39;
private final int i4 = rand.nextInt(20);
static final int INT_5 = rand.nextInt(20);
private Value v1 = new Value(11);
private final Value v2 = new Value(22);
private static final Value VAL_3 = new Value(33);
private final int[] a = {
1, 2, 3, 4, 5, 6};
@Override
public String toString() {
return id + ": " + "i4 = " + i4 + ", INT_5 = " + INT_5;
}
public static void main(String[] args) {
FinalData fd1 = new FinalData("fd1");
//v2=new Value(22);
fd1.v2.i++;
fd1.v1 = new Value(9);
//a.length = 6
for (int i = 0; i < fd1.a.length; i++) {
fd1.a[i]++;
}
System.out.println(fd1);
System.out.println("Creating new FinalData");
FinalData fd2 = new FinalData("fd2");
System.out.println(fd1);
System.out.println(fd2);
}
}
出力:
fd1: i4 = 15, INT_5 = 18
Creating new FinalData
fd1: i4 = 15, INT_5 = 18
fd2: i4 = 13, INT_5 = 18
最初の変数と2番目の変数はコンパイル時の値を持つ最終的な基本型であるため、どちらも大きな違いなしにコンパイル時の定数として使用できます。3番目の変数は、定数を定義するより一般的な方法です。publicはパッケージの外部からアクセスできることを意味し、staticは1つしかないことを強調し、finalは定数であることを意味します。
main()でわかるように、v2がfinalであるからといって、その値を変更できないわけではありません。これは参照であるため、新しいオブジェクトを指すことができないことを意味します。
2)空白の最終
空白の最終は、初期値のない最終属性を指します。
コンパイラーは、使用前にブランクのファイナルを初期化する必要があることを確認します。このようにして、クラスの各オブジェクトの最終的な属性値を変えることができ、その不変性を維持することもできます。
定義時または各コンストラクターで最終変数の割り当てを実行する必要があります。これにより、最終属性が使用前に初期化されていることが保証されます。
3)最終パラメーター
パラメーターリストで、パラメーターを最終として宣言することは、パラメーターが指すオブジェクトまたは基本変数をメソッドで変更できないことを意味します。
class Gizmo {
public void spin() {
}
}
/**
* @author Limh
*/
public class FinalArguments {
void with(final Gizmo g) {
//-g = new Gizmo();
// Illegal -- g is final
}
void without(Gizmo g) {
g = new Gizmo(); // OK -- g is not final
g.spin();
}
//void f(final int i) { i++; } // Can't change
// You can only read from a final primitive
int g(final int i) {
return i + 1;
}
public static void main(String[] args) {
FinalArguments bf = new FinalArguments();
bf.without(null);
bf.with(null);
}
}
4)finalメソッドがfinalメソッドを
使用する理由は2つあります。
サブクラスが上書きによってメソッドを変更しないように、メソッドをロックします。これは、継承によってメソッドの動作が変更されないようにするための継承の考慮事項です。
finalは、メソッドの上書きを明示的に禁止する場合にのみ使用してください。
5)final
クラスとprivateクラスのすべてのプライベートメソッドは、暗黙的にfinalとして指定されます。プライベートメソッドにアクセスできないため、オーバーライドすることはできません。
6)最終クラスクラス
が最終であると言われる場合(最終キーワードはクラス定義の前にあります)、それは継承できないことを意味します。これは、クラスの設計を変更する必要がないため、または安全上の理由からサブクラスを含めることが想定されていないためです。
finalクラスは継承を禁止しているため、クラス内のすべてのメソッドは暗黙的にfinalとして指定され、それらをオーバーライドする方法はありません。最終クラスのメソッドに最終修飾子を追加できますが、意味は追加されません。
上記は、Javaの最終キーワードの包括的な分析の詳細な内容です。Javaの最終キーワードの詳細については、エディター内の他の関連記事に注意してください。