2012-04-01 10 views
1

私はいくつかの質問を探していて、この問題に私を導きます。あなたがオブジェクトインスタンス上の静的メソッドを呼び出すと、それは、例えば、動的または静的に解決しない:静的メソッドは抽象することはできませんなぜそれが説明するだろうので、私はこれを聞いてるのよ、なぜオブジェクトインスタンスとサイドノートで静的メソッドを呼び出すJava

class A 
{ 
    public static foo() {} 
} 
class B extends A 
{ 
    public static foo() {} 
} 
[...] 
public static void main(String[] args) 
{ 
    A a = new B(); 
    a.foo(); // does this all A foo or B foo? 
} 

です。 Aがインタフェースの場合、fooが抽象的かつ静的であれば、これは動作しません。

これは内部的にどのように機能しますか?基本的には、fooが動的ではない場合、fooは静的であることをどのように知っていますか?まだクラスを調べる必要はありませんか?また、それは本当にBであることを知っている場合、それはBにfooを呼び出すのはなぜですか?

答えて

6

コンパイル時タイプaに基づいて静的に解決します。値は無視され、さらにはnullになります

A a = null; 
a.foo(); // Still calls A.foo 

IIRCは、一点でそれがNULLかどうかのチェックを行いましたが、それは今いません。

私は強くとしないようにしてください。少なくとも、いくつかのIDE(Eclipseを含む)ではこれについて警告することができます。コードは、それがどのように見えるしませんし、時にはそれが誤解を招く非常にことができます。

Thread t = new Thread(new Runnable() { /* ... */ }); 
t.start(); 
t.sleep(1000); 

を、それが新たに作成されたスレッドの睡眠を作るようを見えること - しかし、実際にはどの現在スレッドです眠るだろう。イック!

IMO、これは事実上Javaの設計における間違いでした。

+0

あなたのスピードにマッチすることができます誰かのように見えます:) – aviad

+0

私はそれが、非常に良い答えを許可しない理由だと思います:-) – rubixibuc

関連する問題