Javaにおけるfinalキーワードの使い方を例に挙げて説明する
3016 ワード
1. final variable
final variableは定数であり,一度初期化されると変更できない.
出力:
(1)Blank final variable
宣言時に初期化されていないfinal variableはblank final variableと呼ばれ、blank final variableはコンストラクション関数で初期化されなければならない.そうしないとコンパイルエラーが投げ出される.
出力:
(2)Uninitialized static final variable
宣言フェーズで初期化されていないstatic final variableは、静的コードブロックでのみ初期化できます.
出力:
2. final method
final methodは上書きできません.すなわち、サブクラスは親クラスのfianl methodを呼び出すことができますが、上書きすることはできません.
出力:
3. final class
义齿
出力:
PS:java.lang.Stringクラスはなぜfinalに設計されたのですか?まず、finalというキーワードをはっきりさせなければなりません.finalの出現は変えたくないためで、変えたくない理由は2つあります:設計あるいは効率.final修飾のクラスは継承できないのでfinal修飾のクラスは改ざんできない.この点を理解して、(1)設計上、Aは、サブクラスで意味を変更しないことを確保する.Stringクラスはfinalクラスであり、Stringのサブクラスを誰も定義できないことを意味します.すなわち、Stringの参照がある場合、他のクラスのオブジェクトではなくStringオブジェクトを参照します.B、Stringが作成されると修正できません.javaデザイナーがStringを共有できるようにするためです.次の段落はソースコードの注釈です.(2)効率的に言えば、A、finalとして設計されているので、JVMは関連メソッドを虚関数表で照会することなく、Stringクラスの関連メソッドに直接位置決めし、実行効率を向上させます.B、Javaデザイナーは共有がもたらす効率が高いと考えている.要するにjavaを保証することです.lang.Stringが参照するオブジェクトはjavaに違いない.lang.Stringのオブジェクトは、子孫クラスを参照するのではなく、効率と安全を保証します.
final variableは定数であり,一度初期化されると変更できない.
class Test1 {
final double PI = 3.14; //
public Test1(){
PI = 3.14;
}
void test(){
System.out.println("PI is: " + PI);
}
public static void main(String[] args){
Test1 t = new Test1();
t.test();
}
}
出力:
PI is: 3.14
(1)Blank final variable
宣言時に初期化されていないfinal variableはblank final variableと呼ばれ、blank final variableはコンストラクション関数で初期化されなければならない.そうしないとコンパイルエラーが投げ出される.
class Test1 {
final double PI;
Test1(){
PI = 3.14; //
}
void test(){
System.out.println("PI is: " + PI);
}
public static void main(String[] args){
Test1 t = new Test1();
t.test();
}
}
出力:
PI is: 3.14
(2)Uninitialized static final variable
宣言フェーズで初期化されていないstatic final variableは、静的コードブロックでのみ初期化できます.
class Test1 {
static final double 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 is: 3.14
2. final method
final methodは上書きできません.すなわち、サブクラスは親クラスのfianl methodを呼び出すことができますが、上書きすることはできません.
class Test {
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 is: 3.14
3. final class
义齿
final class 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 is: 3.14
PS:java.lang.Stringクラスはなぜfinalに設計されたのですか?まず、finalというキーワードをはっきりさせなければなりません.finalの出現は変えたくないためで、変えたくない理由は2つあります:設計あるいは効率.final修飾のクラスは継承できないのでfinal修飾のクラスは改ざんできない.この点を理解して、(1)設計上、Aは、サブクラスで意味を変更しないことを確保する.Stringクラスはfinalクラスであり、Stringのサブクラスを誰も定義できないことを意味します.すなわち、Stringの参照がある場合、他のクラスのオブジェクトではなくStringオブジェクトを参照します.B、Stringが作成されると修正できません.javaデザイナーがStringを共有できるようにするためです.次の段落はソースコードの注釈です.(2)効率的に言えば、A、finalとして設計されているので、JVMは関連メソッドを虚関数表で照会することなく、Stringクラスの関連メソッドに直接位置決めし、実行効率を向上させます.B、Javaデザイナーは共有がもたらす効率が高いと考えている.要するにjavaを保証することです.lang.Stringが参照するオブジェクトはjavaに違いない.lang.Stringのオブジェクトは、子孫クラスを参照するのではなく、効率と安全を保証します.