-2

クラスがインターフェイスを実装し、メソッドを持ち、子参照を親変数に格納するか、単に動的バインディングが行われる場合、関数の一意性がチェックされるのは動的バインディングのルールであるためtoString()、コンパイラーはインターフェイスでメソッドをチェックしなかったのはなぜですかtoString()親で

例えば。

interface my {
    void show();
}

class child implements my {
    public void show() {
        System.out.println("working");
    }

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

    public static void main(String... s) {
        my m = new child();

        m.show();

        String s = m.toString();
        System.out.println(s);
    }
}

動的バインディングが行われるたびに、上記のメソッドをオーバーライドしない限り、子の個人的なメソッドを実行できないことがわかっているのに、なぜ上記の関数toString()がコンパイルされて出力が得られるのでしょうか?

4

4 に答える 4

3

この質問をしているように聞こえます:

サンプル コードでは、ローカル変数のm型はmy. インターフェイスmyは 1 つのメソッドしか宣言していないshow()のに、なぜ を呼び出せるのm.toString()でしょうか?

これは、継承に関する Sun (現在の Oracle) Java チュートリアルで説明されています。

クラスは、クラスから派生したクラスから派生したクラスから派生することができ、最終的に最上位のクラスであるオブジェクトから派生することができます。このようなクラスは、Object に戻る継承チェーン内のすべてのクラスの子孫であると言われています。

このObjectクラスtoString()はデフォルトメソッドを (他のいくつかの基本メソッドと共に)宣言するため、JavatoString()任意のオブジェクトを呼び出すことができます。


アップデート

Java のすべてのクラス インスタンスはObject から継承する必要があるため、インターフェイスを型として使用する実際のセマンティクスは次のようになります。

public static void main(String... s) {
    // This won't actually compile
    (? extends Object implements my) m = new child(); 

    m.show();

    String s = m.toString();
    System.out.println(s);
}

言い換えれば、 that mhas typeを宣言すると、実際にはそれがinterface を実装するものであるmyと言っているのです。はメソッドを宣言しているため、インターフェイスに存在しなくても呼び出すことができます。mObjectmyObjecttoString()m.toString()toString()my

Java は意図的Objectにクラス階層の最上位に位置するように設計されているためtoString()、任意のオブジェクトの任意のインスタンスの呼び出しについてコンパイラに文句を言わせる方法はありません。hashCode()equals()などについても同様です。

于 2012-09-26T16:32:41.037 に答える
1

あなたの問題は、すでに与えられた2つの答えによって解決されると思います..あなたの声明についていくつか指摘したいだけです: -

  • if a class implements an interface and have a toString() method

定義するクラスにはすべてtoString()メソッドがあります。明白に見えないかもしれませんが、クラスのインスタンスを印刷すると、呼び出されるのはクラスのtoString()メソッドです..(クラスは、定義する他のすべてのクラスのスーパークラスです) .. したがって、クラスで定義されたメソッドは、他のメソッドからアクセスできます。ObjectObjectObjectclass object

このメソッドをオーバーライドして、必要に応じてインスタンスを出力することもできます..しかし、オーバーライドしないとhashcode、オブジェクトを取得しますclassname@12343.. toString()「チェックする必要はありません..メソッドは、すべてのクラスのクラスの一部であるinterfaceことを知っています..toString()Objectsuper class

  • we store the child reference into parent variable

あなたの理解は正しいですが、より意味のあるものにするために、この文を再構成させてください: - We Store the reference to child class object in the parent class reference variable

  • function uniqueness will be check in parent

私は本当に理解できません、あなたはこの文で何を意味していますか..しかし、私が理解している限り、あなたはこう言っています-「 のメソッドがchild classで呼び出されるとparent class reference、コンパイラは最初にそのメソッドがかどうかにparent classかかわらず、あなただけがメソッドを呼び出すことができます..

*編集*:-

Java 言語仕様、セクション 9.2によると: -

インターフェイスに直接のスーパーインターフェイスがない場合、インターフェイスは、署名 s、戻り値の型 r、および throws 句 t を持つ各パブリック インスタンス メソッド m に対応する、シグネチャ s、戻り値の型 r、および throws 句 t を持つパブリック抽象メンバー メソッド m を暗黙的に宣言します。ただし、同じシグネチャ、同じ戻り値の型、および互換性のある throws 句を持つメソッドがインターフェイスによって明示的に宣言されている場合を除きます。

m が Object で final として宣言されている場合に、インターフェイスがそのようなメソッド m を明示的に宣言すると、コンパイル時エラーになります。

インターフェースが Object の public メソッドとオーバーライド等価 (§8.4.2) である署名を持つメソッドを宣言しているが、異なる戻り値の型または互換性のない throws 節を持っている場合、コンパイル時エラーになります。

于 2012-09-26T16:31:41.433 に答える
0

すべてのオブジェクトが伸びObjectます。 public String toString()で定義されてObjectいるため、すべてのオブジェクトにtoString()メソッドがあります。

于 2012-09-26T16:22:52.983 に答える
0

私があなたが求めていると思うことを尋ねているのであれば、それは Java のすべての非プリミティブ (プリミティブは , などですが、 NOT ) が型を持っているintためlongです。 には、 、、およびのメソッドがあります。これは、非プリミティブにもこれらのメソッドがあることを意味します。StringObjectObjecttoString()hashCode()equals()

ただし、通常、これらのメソッドは一般的すぎて特定のクラスには役に立たないため、必要なときにいつでもオーバーロードします。

于 2012-09-26T16:23:05.200 に答える