2016-10-03 18 views
3
public class Test{ 

public static void abc(String s) { 
    System.out.println("String"); 

} 

public static void abc(Object s) { 
    System.out.println("OBject"); 

} 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    abc(null); 

}} 
Output-String 

私は初心者ですが、私は上記のプログラムの出力について混乱しています。 出力の理由を教えてください。なぜ出力が "文字列"であるか。予期しない出力

答えて

1

Javaコンパイラが選択する最も特定のオーバーロードされたメソッドを選択します。これは早期バインディングと呼ばれます。ここではString extends Objectクラスなので、より具体的です。複数のメンバメソッドは、メソッドの呼び出しにアクセスし、該当の両方である場合は、official Java Language Specification

を参照することができ、実行時のメソッドディスパッチのための記述を提供するために、いずれかを選択する必要があります。 Javaプログラミング言語は、最も具体的な方法が選択されるという規則を使用します。

+0

実行時には行われませんが、コンパイル時に –

+0

@ErwinBolwidtありがとう、私は修正を行いました。 –

8

初期(コンパイル時に最も具体的な方法を結合結合。

メソッドをオーバーロードすると、最も特定のメソッドが選択されます。あなたの場合、選択の順序はString>Objectです(のヌルは任意の参照タイプになります)。

階層では、StringはObjectよりも具体的です。したがって、文字列が選択されました。すべてのJavaが複数のメンバメソッドがアクセス可能で、メソッド呼び出しに適用両方の場合JLSは、同じ

http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.2.5

ためである。ここ

オブジェクト間で実際にオブジェクトが特定の最低でありますランタイムメソッドディスパッチの記述子を提供するために1つを選択する必要があります。 Javaプログラミング言語は、最も具体的な方法が選択されるという規則を使用します。

..... [ルール]

+0

ありがとうございました。 @suresh ATTA –

0

あなたが使用している概念がオーバーロードしているとObjectは、Javaのすべてのクラスのスーパークラスです。したがって、特定の実装(この場合はString)と一般的な実装(この場合はObject)を指定すると、JVMはデフォルトで特定の実装になります。あなたはそれを試してみたい場合は、それは一般的なものとなりますので、JVMは、整数のための任意の特定の実装を見つけることができないよう は、この場合abc(123);

abc(null);を交換してください、出力は「オブジェクト」になります。

関連する問題