Javaのサブクラス親コンストラクション関数および静的文ブロックロード
2191 ワード
最近仕事を探していて、前にアリババのキャンパスの招聘の筆記試験にも参加して、中の最後の2番目の問題はJavaの中で関数を構築して、静的な変数と静的な文のブロックのロードの問題についてです.そこで、弟は自分でJavaのサブクラスの親構造関数と静的文ブロックの問題について、実践して操作して、分かち合ってみんなに見せました.
一、Javaのサブクラスの親構造関数の問題
まず例を見てみましょう.
実行結果:
親パラメータなしサブクラスパラメータあり
説明:mainメソッドでは、サブクラスChildのパラメトリック構造関数を使用してオブジェクトを作成し、親クラスFatherのパラメトリック構造関数なしを呼び出し、パラメトリック構造関数を呼び出しません.
ケース1:親Fatherの無パラメトリック関数を注釈して説得力を表現するために、子系列Childの無パラメトリック関数も注釈してしまうと、その時点でエラーとなります.
Problem:暗黙的な超構造関数Father()は定義されていません.別のコンストラクタを明示的に呼び出す必要があります
これは、前述した実行結果も示しています.
ケース2:親Fatherのパラメトリック構造関数のみをロードしたい場合は、パラメトリック構造関数なしではなく、どうすればいいですか?このときsuperは機能し,サブクラスChildのパラメトリック構造関数を以下のように修正する.
再実行、実行結果:
親にパラメータがある サブクラスにパラメータがあります
ちなみに、クラス自体のコンストラクション関数間で呼び出され、thisキーが使用されます.
二、Java静的文ブロックと構造関数のロード順序
静的部分はクラスのロードに伴ってロードされ、コンストラクション関数はオブジェクトの作成に伴ってロードされるため、詳細には言う必要はありません.すなわち,mainメソッドではサブクラスChildタイプの変数のみを音明すると,静的部分が実行され,もちろん構造関数は存在しない.次に,サブクラスChildが親クラスFatherを継承する場合にのみ,静的ブロックとコンストラクション関数のロード順序を示したい.
文書の開始コードの静的文ブロック部分にコメントを削除し、次のように実行します.
親静的ブロック サブクラス静的ブロック 親パラメータなし サブクラスにパラメータがあります
すなわち、親クラスでも子クラスの静的部分でも、クラスのロードに伴ってロードされる関数を構築する前に実行されます.親は子より先にロードされたに違いない.猿が先にいてこそ、人がいるのと同じだ.
一、Javaのサブクラスの親構造関数の問題
まず例を見てみましょう.
public class Child extends Father{
public Child(String s){
System.out.println(" ");
}
public Child(){
System.out.println(" ");
}
// static{
// System.out.println(" ");
// }
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Child child = new Child("child_one");
}
}
class Father{
public Father(){
System.out.println(" ");
}
public Father(String s){
System.out.println(" ");
}
// static{
// System.out.println(" ");
// }
}
実行結果:
親パラメータなしサブクラスパラメータあり
説明:mainメソッドでは、サブクラスChildのパラメトリック構造関数を使用してオブジェクトを作成し、親クラスFatherのパラメトリック構造関数なしを呼び出し、パラメトリック構造関数を呼び出しません.
ケース1:親Fatherの無パラメトリック関数を注釈して説得力を表現するために、子系列Childの無パラメトリック関数も注釈してしまうと、その時点でエラーとなります.
Problem:暗黙的な超構造関数Father()は定義されていません.別のコンストラクタを明示的に呼び出す必要があります
これは、前述した実行結果も示しています.
ケース2:親Fatherのパラメトリック構造関数のみをロードしたい場合は、パラメトリック構造関数なしではなく、どうすればいいですか?このときsuperは機能し,サブクラスChildのパラメトリック構造関数を以下のように修正する.
public Child(String s){
super(s); //
System.out.println(" ");
}
再実行、実行結果:
親にパラメータがある サブクラスにパラメータがあります
ちなみに、クラス自体のコンストラクション関数間で呼び出され、thisキーが使用されます.
二、Java静的文ブロックと構造関数のロード順序
静的部分はクラスのロードに伴ってロードされ、コンストラクション関数はオブジェクトの作成に伴ってロードされるため、詳細には言う必要はありません.すなわち,mainメソッドではサブクラスChildタイプの変数のみを音明すると,静的部分が実行され,もちろん構造関数は存在しない.次に,サブクラスChildが親クラスFatherを継承する場合にのみ,静的ブロックとコンストラクション関数のロード順序を示したい.
文書の開始コードの静的文ブロック部分にコメントを削除し、次のように実行します.
親静的ブロック サブクラス静的ブロック 親パラメータなし サブクラスにパラメータがあります
すなわち、親クラスでも子クラスの静的部分でも、クラスのロードに伴ってロードされる関数を構築する前に実行されます.親は子より先にロードされたに違いない.猿が先にいてこそ、人がいるのと同じだ.