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は親を指します.
 
次に、不完全な例を示します.
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();
	}
}