0

次のコードブロックがあるとします。

public class Trial {
    public static void main (String[] args){
        B obj = new B();
        obj.doMethod(); #prints "From A".
    }
}

class A {
    private void method(){System.out.print("from A");}
    public void doMethod(){method();}
}

class B extends A {
    public void method(){System.out.print("from B");}
    public void doMethod(){super.doMethod();}
}

クラスAのmethod()が呼び出されていることがわかります。どうしてこれなの?

4

6 に答える 6

2

そのように明示的に実装します。superである基本クラスからメソッドを呼び出しますA

public void doMethod(){super.doMethod();}

したがって、メソッドチェーンは次のようになります。

B.doMethod() -> A.doMethod() -> A.method() -> "from A"
于 2013-01-24T05:43:31.063 に答える
1

あなたの質問は、 inclass A private void method(){System.out.print("from A");}が非公開の場合、なぜ「from A」を in に印刷しているのかということだと思いますclass B

答えは非常に簡単です。method()他のクラスから A クラスを呼び出すことはできませんが、独自のオブジェクトで呼び出すことはできます。

super.doMethod();スーパーの関数を呼び出すmethod()と、独自のメソッドであるため、呼び出すことができます。

于 2013-01-24T05:54:03.970 に答える
0

クラスAのmethod()はプライベートであり、プライベートメソッドをオーバーライドすることはできません。また、オーバーライドするときは、@Overrideアノテーションを使用することをお勧めします。

class B extends A {

    @Override
    public void method(){System.out.print("from B");} // Compile error
}

メソッドを静的メソッドに変更した場合も、同様のことが起こります。

class A {
    public static void method(){System.out.print("from A");}
}

class B extends A {
    public static  void method(){System.out.print("from B");}
}
于 2013-01-24T06:04:02.340 に答える
0

なぜなら、以下を参照してください:

class B extends A {
    public void method(){System.out.print("from B");}
    public void doMethod(){super.doMethod();}
}

ここで、クラスBのdoMethod()では、super.doMethod()を使用してクラスAのdoMethod()を呼び出しています。したがって、明らかに、クラスAのdoMethod()を出力しています。

于 2013-01-24T05:44:17.573 に答える
0

スーパーキーワードを使用してdoMethodを呼び出します。これは、親の実装を呼び出すことを意味します。スーパーキーワードの詳細

于 2013-01-24T05:46:02.480 に答える
0

あなたのコードは、単純なオブジェクトの作成 (B obj = new B();) と、super を使用した呼び出しを提供します。スーパーは、親クラスについて言及されている他の人々と同じように使用されます。(A obj = new B();) のようなものを試してみると、状況が変わっていた可能性があり、これはより興味深いものです。

于 2013-01-24T05:56:14.257 に答える