0

私はこの次のコードを持っています、そして私はオーバーロードの概念に関していくつかの説明が必要です。

class Overload{
    static void print(Object o){
        System.out.println("object");
    }
    static void print(String s){
        System.out.println("string");
    }
    public static void main(String...args){
        print("Hello");
    }
}

これを実行すると、出力は文字列になります。イベントobjectはスーパークラスですが、なぜstring代わりに表示されるのobjectですか?

前もって感謝します

4

5 に答える 5

4

この場合のルールは次のとおりです。

より具体的な署名が適用されます

Stringより具体的でObjectあるため、print(String)が使用されます。たとえば、で試してみると、コンパイラにはがであるか、であるかを区別する方法がないため、そのようなコードはコンパイルされないことがわかりますprint(null)mainnullStringObject

Oracleオーバーロードチュートリアルを確認してください

于 2013-01-24T11:31:34.173 に答える
1

完全に一致する場合、オーバーロードされた関数の間、JVMは一般化を考慮しないためです。つまり、引数の型に一致する最適なものを探します。この場合、「Hello」は文字列型と完全に一致します。にString収まるので。したがって、それは考慮されませんStringObject

static void print(Object o)
于 2013-01-24T11:30:16.503 に答える
1

オブジェクトであるパスをstring渡すため、printと呼ばれます。"Hello"String

Stringまた、通常の呼び出しを拡張Objectしますが、オーバーロード呼び出しも最も上位のタイプです。

于 2013-01-24T11:30:21.977 に答える
1

現在、このバージョンのオーバーロードされたメソッドは次のように実行されます。

static void print(String s){
    System.out.println("string");
}

あなたはこのように呼んでいるので: print("Hello");

データ変換は、正しいバージョンの一致が見つからない場合にのみ発生します。そして、コンパイラーと完全に一致するものが見つかりました。

于 2013-01-24T11:30:33.227 に答える
1

最初にを探します。見つからない場合は、Stringのスーパークラスの引数で検索しJVMます。それでも見つからない場合は、のスーパークラスのスーパークラス。そして、このアルゴリズムはが存在するまで続きます。またはエラーを報告するprint(String)print()Stringprint(Object)

于 2013-01-24T11:35:17.580 に答える