JAva--無視できる詳細(二)

2860 ワード

クラスの継承:
ベースクラスの初期化
ベースクラスサブオブジェクトはコンストラクタで初期化操作を正しく実行し、派生クラスのコンストラクタではjavaがベースクラスの呼び出しを自動的に挿入します.
次のコードを参照してください.
package com.demo;

class Art{
	Art(){
		System.out.println("Art construct");
	}
}
class Drawing extends Art{
	Drawing(){
		System.out.println("Drawing construct");
	}
}

public class Cartoon extends Drawing {
	Cartoon(){
		System.out.println("Cartoon construct");
	}
	public static void main(String[] args) {
		Cartoon car= new Cartoon();
	}

}

出力:Art construct
Drawing costruct
Cartoon construct
しかし、変数を含むコンストラクタでは、上記の例のようにデフォルトで呼び出すことはできません.なぜなら、引数を具体的に渡す問題はありません.したがって、ベースクラスに対する呼び出しコードを明確に記述する必要があります.これがsuperキーワードで実現され、以下の少し変更されたコードを見てください.
package com.demo;

class Art{
	Art(int i){
		System.out.println("Art construct"+i);
	}
}
class Drawing extends Art{
	Drawing(int i){
		super(i);
		System.out.println("Drawing construct"+i);
	}
}

public class Cartoon extends Drawing {
	Cartoon(){
		super(17);
		System.out.println("Cartoon construct");
	}
	public static void main(String[] args) {
		Cartoon car= new Cartoon();
	}
}

finalキーワード
1,適用の場合,データ:基本データ型のデータを修飾し,そのデータは初期化しなければならず,その後の値は変わらない.オブジェクトハンドルの場合、このハンドルは特定のオブジェクトに初期化され、別のオブジェクトを指すように変更することはできませんが、オブジェクトの特定の内容は変更できます.
また,基本的なデータ型でなければ,空白のfinalが許容される(宣言なしで初期化される).
2,適用の場合,方法:1,方法をfinalに修飾すると,任意の継承クラスがその本来の意味を変えることを防止できる.2,コンパイラは,このメソッドのすべての呼び出しを「埋め込み」呼び出しに入れる.コンパイラがfinalメソッド呼び出しを発見すると、メソッド呼び出しの代わりにメソッドトピック内の実際のコードのコピーが使用され、メソッド呼び出し時のシステムオーバーヘッドを回避できます.(備考:方法の体積はあまり大きくなくて、できるだけ簡潔にするべきです)
3,適用する場合,クラス:1,そのクラスが継承されてはいけないことを示す.2,finalクラスについては,メソッドはすべてfinalとデフォルトであるが,実際にはサブクラスはなく,もちろんクラスを書き換えることもなく,当然finalのメソッドである.
継承初期化について
まず次のコードを見てください.
package com.demo;

class Insect{
	int i=9;
	int j;
	Insect(){
		prt("i="+i+",j="+j);
		j=39;
	}
	
	static int x1=prt("static Insect.x1 initialized");
	
	static int prt(String s){
		
		System.out.println(s);
		return 47;
	}
}
public class Beetle extends Insect{

	int k = prt("Beetle.k initialized");
	
	Beetle(){
		prt("k="+k);
		prt("j="+j);
	}
	static int x2=prt("static Beetle.x2 initialized");
	
	static int prt(String s){
		System.out.println(s);
		return 63;
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		prt("Beetle constructor");
		Beetle b = new Beetle();
	}
}

出力:
static Insect.x1 initialized
static Beetle.x2 initialized
Beetle constructor
i=9,j=0
Beetle.k initialized
k=63
j=39

staticについては、前にたくさん話しましたが、あまり話しません.
注意2点1では、マウント中に親から開始し(親には親もいるので上を探します)、次にルートベースクラスを初期化し、派生クラスの初期化はベースクラスメンバーの正確な初期化に依存するため、下に初期化します.
2、まず(変数など)宣言をロードしてから、コンストラクタを呼び出します.コンストラクタは関連するデータの初期化が多いからです.