次の4つのクラスに問題があります。
class X {
void a() {
b();
c();
}
void b() {
System.out.println("b from class X");
}
private void c() {
System.out.println("c from class X");
}
}
class Y extends X {
void b() {
System.out.println("b from class Y");
}
}
class Z extends Y {
void b() {
System.out.println("b from class Z");
}
void c() {
System.out.println("c from class Z");
}
}
public class Main {
public static void main(String[] args) {
Y y = new Z();
y.a();
}
}
クラスの合理性についてコメントしないでください。これは単なる例です。また、Eclipse デバッガーを使用してメソッドを介して JVM の流れをたどろうとしましたが、メソッドを介した手順は、いくつかの点で少し高速です。
私はすでにそれを手に入れました
Y y = new Z();
Z クラスの新しいインスタンスを作成し、それを Y クラスの参照に割り当てます。Z にはコンストラクターがないため、コンパイラーは各スーパークラスにコンストラクターがあるかどうかを調べ、ない場合はオブジェクト クラスのコンストラクターを使用します。その後、
y.a();
メソッドが呼び出されます。クラス Z にはそのようなメソッドはありません。したがって、メソッド a が存在するクラス X で終了し、それを実行します。最初にメソッド b を実行します。これは、オブジェクトがクラス Z のインスタンスであり、メソッド b がクラス Z で上書きされているため、出力につながります
b from class Z.
その後、メソッド c が (メソッド a で) 呼び出されます。私たちのインスタンスはまだクラス Z のインスタンスであり、このクラスにはメソッド c が存在するため、出力が
c from class Z
発生します。しかし、クラス X の c メソッドはプライベート メソッドであるため、これは当てはまりません。プライベートであるため、サブクラスに継承することはできません (表示することさえできません)。したがって、X から継承するクラスにも c メソッドがある必要はありません。そのため、メソッド a から c を呼び出すと、クラス Z ではなくクラス X で c メソッドが呼び出されるというのは本当ですか?
要約すると、上記の説明は正しいですか、それとも何か不足していますか? 私のインスタンスはクラス Z からのものですが、メソッド a 内からメソッド c を呼び出すと、次の結果が得られることを少し混乱させました。
b from class Z
c from class X
私の最初のアイデアは、出力が次のようになることでした。
b from class Z
c from class Z
うまくいけば、誰かが今私を助けることができる方法で問題を説明しました. すべての返信ありがとうございます。