0

親と子の関数呼び出しメカニズムの関係を理解し​​ようとしていますが、これは得られませんでした

class Parent {
    Parent() {
        greeting();//as we are not calling this on any object, by default it has Parent's greeting method
    }

    void greeting() {
        System.out.println("Greeting Parent");
    }
}

public class SuperConstructor extends Parent {
    public SuperConstructor() {
   //super(); //i know this
        greeting();
    }

    void greeting() {
        System.out.println("Greeting Child");
    }

    public static void main(String[] args) {
        new SuperConstructor();
    }
}

出力:
あいさつ子、なぜ? 物事はここでどのように機能しますか?
あいさつ子


OUTPUT (予想通り)
親に挨拶 (理由: 親クラスにメソッドがあるから)
子供に挨拶

4

3 に答える 3

3

継承のルール:子クラスにオーバーライド メソッドが存在する場合は、常に最初に実行されます。親のメソッドは無視されます。

それで、ここで何が起こりますか?

>>これnew SuperConstructor();が最初に実行されます。

>>子の新しいクラスを作成します

>>常に覚えておいてください。子コンストラクターからスーパーコンストラクターへの呼び出しがない場合、 JVMは暗黙的に子クラス コンストラクターにスーパー コンストラクターを追加します。そして、それが実行する最初の行になります。

>>したがって、子コンストラクターは を呼び出しますSuper()。そして、親コンストラクターが実行されますgreeting();子クラスにはそのメソッドのオーバーライドがあるため、親の代わりにそれを実行します。なんで ?それが私たちの継承ルールだからです。

>>その後、子コンストラクターの実行は通常どおり進行します。次は ですgreeting();。これにより、Child のメソッドが再度実行されます。なんで ?私たちの継承のルールがそう言っているからです。

于 2013-05-12T02:34:21.127 に答える
1

Greeting Child出力として表示される理由は、メソッドがクラスのメソッドgreeting()SuperContructorオーバーライドするためです。メソッドが別のメソッドをオーバーライドすると、 is が完全に置き換えられます。オーバーライドと非表示について説明している次の投稿をご覧ください:オーバーライドと非表示 Java - 混乱greeting()Parent

于 2013-05-12T02:27:54.050 に答える
1

これは、Parent がオーバーライドされたメソッドを呼び出しているためです。プライベートにすると、期待どおりの結果が得られます。プライベート メソッドはオーバーライドできません。

于 2013-05-12T02:29:01.140 に答える