-1

インターフェイスの 1 つのシナリオで混乱しています。以下toString()は、インターフェイスでメソッドを宣言していないコードです。
これはオブジェクト クラスのメソッドです。ただし、メソッドtoString()は親クラスの参照変数から実行できます。ただし、ルールでは、子クラスのメソッドを呼び出す前に、まずインターフェイス内のメソッドを参照し、メソッドが存在する場合は子クラスのメソッドを呼び出します。しかし、このシナリオでは、インターフェイスで宣言せずにどのようtoString()
に実行されるか説明してください

    public interface Parent {
    void show();
}

class Base implements Parent {
    public void show() {
        System.out.println("hey it is going to be execute");
    }

    public String toString() {
        return "itspossible";
    }

    public static void main(String[] args) {
        Parent parent = new Base();
        System.out.println(parent.toString());
    }
}
4

7 に答える 7

5

これが機能するのは、すべてのクラスがObjectクラスを暗黙的に拡張するためです。したがって、どのインターフェースのどの実装でも、toString()メソッドを使用できます。

于 2013-06-17T08:38:40.453 に答える
1

これは、すべてのクラスの派生元であるtoStringメソッドが含まれているためです。ObjectメソッドはObjectクラスから呼び出されています。

Jon Skeet がこの質問に答えており、それがよく説明されています。

インターフェイスはデフォルトでオブジェクトを拡張しますか?

于 2013-06-17T08:38:24.203 に答える
0

最後に、クラスparentからのオブジェクト参照です。すべてのクラスは class から拡張されるため、などのクラスで定義されたメソッドを持つことにBase注意してください。ObjectObjecttoString

于 2013-06-17T08:38:33.113 に答える
0

Objectクラスはすべてのクラスの基本クラスであり、toStringメソッドが含まれているためです。したがって、親の参照で呼び出すtoStringと、親の参照が呼び出されますtoString().

于 2013-06-17T08:40:09.987 に答える
0

変数parentは、そのサブタイプを参照する単なる参照Childです。Childここでは、デフォルトでObjectクラスを拡張するオブジェクトを作成しています。メソッドをオーバーライドしているtoStringため、この出力が得られます。

于 2013-06-17T08:40:34.257 に答える
0

toStringあなたはインターフェースのメソッドを呼び出していませんが、それはBash クラスメソッドです。toString明示的に実装しなくても、各オブジェクトにはメソッドのデフォルト実装があります。

インターフェースのインスタンスは、Object クラスのメソッドにどのようにアクセスできますか?

于 2013-06-17T08:41:14.557 に答える