2012-12-04 26 views
10

私は右ここ多型と静的メソッド

public Car { 
    public static void m1(){ 
     System.out.println("a"); 
    } 
    public void m2(){ 
     System.out.println("b"); 
    } 
} 

class Mini extends Car { 
    public static void m1() { 
     System.out.println("c"); 
    } 
    public void m2(){ 
     System.out.println("d"); 
    } 
    public static void main(String args[]) { 
     Car c = new Mini(); 
     c.m1(); 
     c.m2();  
    } 
} 

をこのコードについて疑問を持って、私は多型が唯一のインスタンスメソッドに、静的メソッドでは動作しないことを知っています。また、オーバーライドは静的メソッドでは機能しません。 C、D

cはM1メソッドを呼び出しますので、それは上書きすることはできませんので、それは、静的だし、クラスのミニの代わりに、車の中でメソッドを呼び出します。

は、したがって、私は、このプログラムは、プリントアウトすべきだと思います。

これは間違いありませんか?

はしかし、私の教科書は、答えはであることを述べている:、D

がタイプミスでしょうか?今私はちょっと混乱しているから。

これをクリアしてください。ありがとうございます。

答えて

26

cはm1メソッドを呼び出しますが、静的なのでオーバーライドできず、CarではなくMiniクラスのメソッドを呼び出します。

これは正確に後方です。

cCarによって定義されたメソッドを呼び出すcを介して行わCarとしてので、静的メソッド呼び出しを宣言されます。
cが実際にMiniを保持していることを意識することなく、コンパイラはを直接Car.m1()にコンパイルします。

このような理由から、静的メソッドを決して呼び出さないでください。

+4

+1 *これは、静的メソッドをそのようなインスタンスで決して呼び出さないようにする理由です。* – Joffrey

関連する問題