final 修飾子:
Final 変更されたメンバー変数には、プログラマによって明示的に指定された初期値が必要です。
クラスのフィールド: 初期値は、静的初期化ブロック内、またはフィールドの宣言時に指定する必要があります。
インスタンス フィールド: フィールドは非静的初期化ブロックで宣言するか、コンストラクターで初期値を指定する必要があります。
最終ローカル変数: プログラマが明示的に初期化する必要があります。
最終的に変更された基本変数と参照型変数の違いは何ですか?
final によって変更された基本変数: 基本変数は再割り当てできません。
最終的に変更された参照変数: この参照型によって参照されるアドレスが変更されないことのみを保証します。つまり、
は常に同じオブジェクトを参照しますが、このオブジェクトは完全に変更される可能性があります。
/** */ import java.util.*; public class Demo5 { public static void main(String[] args) { final B b = new B(22); b.test(); //合法 改变值,但仍是指向同一个引用 b.setAge(20); System.out.println(b.getAge()); // 非法 // b = null; b.test2(); } } /** fianl修饰成员变量 */ class A { //合法 final int a = 10; //构造器或初始化化块中指定初始值 final String str; final int c; final static double d; { str = "hello"; //非法 // a = 100; } static { d = 100; } // 构造器可对没在初始化块中指定的Field指定初始值 public A() { // 非法 // str = "ddd"; c = 1000; } public double changFinal() { // 不能再普通方法中为final指定初始值 // return d = 1000.90; return 0; } } /** fianl修饰数组 对象 */ class B { private int age; public B() { } public B(int age) { this.age = age; } public void setAge(int age) { this.age = age; } public int getAge() { return this.age; } public void test() { final int[] arr={23,434,56,898}; System.out.println(Arrays.toString(arr)); Arrays.sort(arr); System.out.println(Arrays.toString(arr)); arr[2] = 200; System.out.println(Arrays.toString(arr)); //下面对Arr重新赋值 非法 // arr = null; } /** 加深对final的理解 */ public void test2() { String str1 = "美好未来"; //直接引用常量池中的"美好未来" String str2 = "美好"+"未来"; //true System.out.println(str1 == str2); String s1 = "美好"; String s2 = "未来"; String s3 = s1+s2; //false s1 s2只是变量 在编译时期不能确定 //若想在编译时期确定 则用 final修饰 s1 s2 System.out.println(str1 == s3); } }
Java の Final 修飾子について何か知っていますか? ここでは詳しく説明しませんが、Java の Final 修飾子の例の分析に関連する他の記事にも注目してください。 PHP中国語サイトへ!