ホームページ >Java >&#&チュートリアル >Java でのコンストラクターの使用方法の詳細な説明
この記事では、Java コンストラクターの使用方法と注意点に関する関連情報を主に紹介します。コンストラクターの使用方法と注意点の例を示します。 Javaコンストラクターの使い方と注意点
スーパークラスのコンストラクターはサブクラスのコンストラクターよりも先に実行されます。つまり、オブジェクトを作成するときは、スーパークラス内のコンストラクターが最初に実行されます。このとき、スーパークラスのコンストラクターを実行するときに、コンストラクターがオーバーライド可能なメソッドを実行すると、サブクラスのメソッドが呼び出されます。この時点では、サブクラスはまだインスタンス化されていません。この時点で問題が発生する可能性があります。
例を見てみましょう:
public class Super { int age = 10; protected void say() { System.out.println("super"); } public Super() { override(); } public void override() { System.out.println("super override"); } } class Sub extends Super { int age = 9; private final Date date; public Sub() { date = new Date(); } @Override public void override() { System.out.println(date); } @Override protected void say() { System.out.println("sub"); } public static void main(String[] args) { Super sub = new Sub(); sub.override(); // sub.say(); // System.out.println(sub.age); } }
2 つのクラス (メンバー変数 age=10 を定義する Super.java) を作成し、コンストラクターで override() メソッドを呼び出します。 Sub.java は Super.java を継承し、コンストラクタ内で日付を初期化します。
ここで main メソッドを実行します。コンソールには何が表示されるでしょうか? 1 つの日付ですか? それとも 2 つの日付ですか? 答えは、最初に null を出力してから、特定の日付の値を出力することです。そして、Sub.javaのオーバーライドメソッドで日付のメソッドが呼び出されると、NPEが表示されます
なぜこれが起こるのでしょうか?
new を使用してオブジェクトを作成する場合、クラスが親クラスから継承しているかどうかを最初に確認することはわかっています。継承している場合は、new Sub() のときに、親クラスのコンストラクターが最初に呼び出されます。を使用すると、Sub が Super のサブクラスであることがわかり、まず Super のコンストラクタが呼び出され、Super のコンストラクタ内で override メソッドが呼び出されていることがわかり、次にサブクラスの Sub クラスが検索されます。オーバーライド メソッドがオーバーライドされたことがわかり、サブクラスのオーバーライドを呼び出して日付を出力します。この時点では日付が初期化されていないため、値は null です。
親クラスの構築メソッドが実行された後、サブクラスの構築メソッドが実行されます。このとき、日付が初期化されるため、再度オーバーライドメソッドを呼び出すと、日付が正しく出力されます。
sub.age を呼び出すと、何が出力されますか? 10ですか9ですか?
実際には、10 が出力されます。オブジェクトを作成するとき、インスタンス変数には 2 つのタイプがあります。1 つは宣言された型で、後者は
Super sub = new Sub();
の実際の型です。 sub は Super で、実際のタイプは Sub です。
メンバー変数を呼び出すときは、まず宣言された型で変数を検索します。変数が存在しない場合は、宣言された型の変数値が使用されます。実際のタイプ。
メソッドを呼び出すときは、まずサブクラスで対応するメソッドを探し、サブクラスに存在しない場合は、親クラスのメソッドを呼び出します。
以上がJava でのコンストラクターの使用方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。