Javaのキーワードstatic、this、super、final
3501 ワード
Javaキーワードの再学習を引き起こすのは、プロジェクトグループで発生した問題によるもので、異なるコンテナweblogic、ejbアクセスクラスの同じstaticメソッドを通じて、結果が異なり、プログラムの実行時に重大な災害が発生します.(本稿は多くの点で他の点から抜粋している)
一、static
1、static修飾メンバーフィールド
クラスが仮想マシンにロードされると、まずstaticメンバーフィールドをフィールド宣言の前後順に初期化します.
2、static修飾メンバー関数
このメンバー関数はthisオブジェクトを使用できません
staticはコンストラクション関数を修飾できません
staticは関数パラメータを修飾できません
staticはローカルメンバー変数を修飾できません
3、static修飾文ブロック
クラスが仮想マシンにロードされると、宣言順にstaticメンバーフィールドとstatic文ブロックが相次いで初期化されます.
staticが修飾するメソッドとフィールドはクラスのみに属し、すべてのオブジェクトが共有されます.
staticで修飾された関数および文ブロックでは、static以外のメンバーフィールドは使用できません.
二、final
1、final修飾類
クラスを継承できないことを示します
final修飾不可能interfaceインタフェースとabstractクラス
2、final修飾方法
このメソッドがクラスに上書きされてはいけないことを示します(すなわち、サブクラスは親のfinalメソッドを書き換えることはできませんが、継承することができます)
final修飾不可能構造関数
3、final修飾メンバー属性
属性値が最初に初期化されてから変更できないことを示します.
finalプロパティは、直接初期化またはコンストラクション関数で初期化できます.直接初期化の場合、その値は他の関数(コンストラクション関数を含む)で変更できません.
4、final修飾関数パラメータ
パラメータ値は関数では変更できません
5、final修飾関数における局所変数
ローカル変数の初期化後の値は変更できません
finalを使う意味
第一に、メソッドのために「鍵をかける」ことで、継承クラスが本来の意味と実現を変えることを防止します.プログラムを設計する際に,メソッドの動作を継承期間中に一定に保ち,上書きや書き換えができないようにすれば,この方法を採用することができる.
第二に、プログラム実行の効率を高め、一つの方法をfinalに設定すると、コンパイラはその方法に対するすべての呼び出しを「埋め込み」呼び出しに入れることができる(埋め込みメカニズム).
Javaでグローバル変数を定義するのはstaticによって実現され、定数はstatic finalによって実現されます.
三、this&&super
thisは通常、現在のオブジェクトを指し、superは親を指します.
次に、不完全な例を示します.
一、static
1、static修飾メンバーフィールド
クラスが仮想マシンにロードされると、まずstaticメンバーフィールドをフィールド宣言の前後順に初期化します.
2、static修飾メンバー関数
このメンバー関数はthisオブジェクトを使用できません
staticはコンストラクション関数を修飾できません
staticは関数パラメータを修飾できません
staticはローカルメンバー変数を修飾できません
3、static修飾文ブロック
クラスが仮想マシンにロードされると、宣言順にstaticメンバーフィールドとstatic文ブロックが相次いで初期化されます.
staticが修飾するメソッドとフィールドはクラスのみに属し、すべてのオブジェクトが共有されます.
staticで修飾された関数および文ブロックでは、static以外のメンバーフィールドは使用できません.
二、final
1、final修飾類
クラスを継承できないことを示します
final修飾不可能interfaceインタフェースとabstractクラス
2、final修飾方法
このメソッドがクラスに上書きされてはいけないことを示します(すなわち、サブクラスは親のfinalメソッドを書き換えることはできませんが、継承することができます)
final修飾不可能構造関数
3、final修飾メンバー属性
属性値が最初に初期化されてから変更できないことを示します.
finalプロパティは、直接初期化またはコンストラクション関数で初期化できます.直接初期化の場合、その値は他の関数(コンストラクション関数を含む)で変更できません.
4、final修飾関数パラメータ
パラメータ値は関数では変更できません
5、final修飾関数における局所変数
ローカル変数の初期化後の値は変更できません
finalを使う意味
第一に、メソッドのために「鍵をかける」ことで、継承クラスが本来の意味と実現を変えることを防止します.プログラムを設計する際に,メソッドの動作を継承期間中に一定に保ち,上書きや書き換えができないようにすれば,この方法を採用することができる.
第二に、プログラム実行の効率を高め、一つの方法をfinalに設定すると、コンパイラはその方法に対するすべての呼び出しを「埋め込み」呼び出しに入れることができる(埋め込みメカニズム).
Javaでグローバル変数を定義するのはstaticによって実現され、定数はstatic finalによって実現されます.
三、this&&super
thisは通常、現在のオブジェクトを指し、superは親を指します.
次に、不完全な例を示します.
public class Father {
//public static int age = 32; static static
static{
System.out.println("father init");
//name=" "; error
age = 30;
//this.age=30; error
}
public Father(){
this.name = " ";
height=180;
//weight = 160; error
System.out.println("father ");
}
public String name;
public static int age;
public static final String sex = " ";
public final int height;
public final int weight=150;
public void run(){
//static int i = 1; error
System.out.println("father run");
}
public final void sleep(){
System.out.println("father sleep");
}
public static void eat(){
int i = 1;
final int a = 3;
//a = 4 ; error
//this.name = "father"; error
//name = "father"; error
age = 32;
System.out.println("father eat");
System.out.println(age);
}
}
public final class Son extends Father{
static{
System.out.println("son init");
age = 13;
}
public Son(){
super();
name = " ";
System.out.println("son ");
}
public void run(){
System.out.println("son run");
}
public static void eat(){
System.out.println("son eat");
}
/* error
* public void sleep(){
System.out.println("son sleep");
}*/
public static void main(String []args){
Father f = new Son();
System.out.println(Father.age);
System.out.println(Son.age);
System.out.println(f.name);
System.out.println(f.height);
Father.eat();
f.sleep();
f.run();
f.eat();
}
}