2011-03-22 11 views
1
class A{} 
class Z{} 
class S{} 

public class Demo6 { 

    void fun(A a){ 
     System.out.println("A reference"); 
    } 

    void fun(Z z){ 
     System.out.println("Z reference"); 
    } 

    void fun(Object o){ 
     System.out.println("other reference"); 
    } 

    public static void main(String args[]){ 
     new Demo6().fun(new A()); 
     new Demo6().fun(new S()); 
    } 
} 

上記のコードの出力が来ている:Javaのオブジェクトクラスの背後にあるメカニズムは何ですか?

参照

他の参照

私の混乱は、我々は「S」クラスオブジェクトを渡していると、「他の参照は、」印刷する方法です。 「S」クラスオブジェクトが「オブジェクト」クラスとどのように互換性があるかについての実際のメカニズムを詳述してください。

+0

静的メソッドを使用してこの例を簡略化できます。 –

+0

AをZに拡張し、どちらが呼び出されたかを確認します。 ;) –

+0

ya ...私はZを拡張し、そのリファレンスと他の参照を与えます。 – Nitish

答えて

2

すべてのクラスはjava.lang.Objectを親として持っています - extends Objectを書かなくても、コンパイラはそれを自動的に追加します。引用するにはthe javadoc

クラスオブジェクトはクラス階層のルートです。すべてのクラスはスーパークラスとしてObjectを持っています。配列を含むすべてのオブジェクトは、このクラスのメソッドを実装します。

Sは明らかに存在し、そうでなければコンパイルされません。その後、コンパイラは最も具体的な呼び出し方法を選択します。 Sは、ZでもAも署名と一致せず、Objectと一致します。

+0

Y 'S'クラスが存在していないと、コンパイルエラーが発生します。 – Nitish

+0

私は 'S'クラスオブジェクトを渡しているので、変数とメソッドのように 'S'クラスには何も定義されていません。次に、 'S'クラスポインティングの参照が渡されるアドレス、またはnullがfun()メソッドの引数に渡されますか? – Nitish

+0

@Nitish 'S'が渡されます(' S'へのハンドル、つまり)。しかし、javaは値渡しではないので、参照を再割当てすることはできません – Bozho

5

すべてのクラスは、明示的に拡張しなくても、java.lang.Objectのサブクラスです。 Javaですべてのクラスは、オブジェクトのサブクラスであるよう

+1

簡潔な、完全に質問に答える。 –

0

Sは、オブジェクトのタイプです。 場合の適切な方法のJava検索楽しい()、 引数と一致し、したがって、それが呼び出され楽しい(Objectオブジェクト)のため

Javaでメソッドオーバーロードを見てみてください。