1。最終変数
最終変数は、初期化されると変更できない定数です。
クラスtest1 {最終ダブルPI = 3.14; //定数の名前は、最高の資本化されたパブリックテスト1(){pi = 3.14; } void test(){system.out.println( "pi is:" + pi); } public static void main(string [] args){test1 t = new test1(); t.test(); }}出力:
PIは3.14です
(1)空白の最終変数
宣言時に初期化されていない最終変数は、空白の最終変数と呼ばれます。空白の最終変数はコンストラクターで初期化する必要があります。そうしないと、コンパイルエラーがスローされます。
クラスtest1 {最終ダブルPI; test1(){pi = 3.14; // constructorで初期化} void test(){system.out.println( "pi is:" + pi); } public static void main(string [] args){test1 t = new test1(); t.test(); }}出力:
PIは3.14です
(2)非初期化静的最終変数
宣言フェーズ中に初期化されていない静的最終変数は、静的コードブロックでのみ初期化できます。
クラスtest1 {静的最終ダブル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は3.14です
2。最終的な方法
最終的な方法を上書きすることはできません。つまり、サブクラスは親クラスのfianlメソッドを呼び出すことができますが、上書きすることはできません。
クラステスト{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は3.14です
3。最終クラス
最終的なCalを継承することはできません
最終クラス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は3.14です
PS:なぜJava.lang.Stringクラスがファイナルとして設計されているのですか?
まず、キーワードファイナルについて明確でなければなりません。
ファイナルは変更を望まないように見えますが、変更を望まない理由は2つあります。デザインまたは効率です。ファイナルによって変更されたクラスを継承することはできないため、ファイナルによって変更されたクラスを改ざんすることはできません。
これを理解した後、問題を見てみましょう。
(1)デザインの観点から、
A.サブクラスのセマンティクスを変更しないようにしてください。文字列クラスは最終クラスです。つまり、文字列のサブクラスを定義することは誰も許可されていません。言い換えれば、文字列参照がある場合、文字列オブジェクトを参照する必要がありますが、他のクラスのオブジェクトではありません。
B. Javaデザイナーが文字列を共有するため、作成されると文字列を変更することはできません。次の段落は、ソースコードのコメントです。
(2)効率の観点から:
A.ファイナルとして設計されたJVMは、仮想関数テーブルで関連するメソッドを照会する必要はありませんが、文字列クラスの関連するメソッドに直接見つけて、実行効率を向上させます。
B. Javaのデザイナーは、共有すると効率が高まると考えています。
要するに、Java.lang.Stringによって参照されるオブジェクトが、その効率と安全を確保するために、その子孫を参照するクラスではなく、java.lang.stringのオブジェクトでなければならないことを確認する必要があります。