2012-12-04 18 views
10

Mam pytanie o kod tutajPolimorfizm i Metody statyczne

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();  
    } 
} 

wiem, że polimorfizm nie działa z metod statycznych, tylko do metody instancji. A także to przesłonięcie nie działa dla metod statycznych.

Dlatego myślę, że ten program powinien wypisać: c, d

Ponieważ c wywołuje metodę M1, ale jest statyczne, więc nie może zastąpić i to wywołuje metodę w klasie Mini zamiast samochodów.

Czy to prawda?

Jednak mój podręcznik mówi, że odpowiedź powinna być: a, d

jest literówka? Ponieważ jestem teraz nieco zdezorientowany.

Proszę to wyjaśnić, dziękuję.

Odpowiedz

26

Ponieważ c wywołuje metodę m1, ale jest statyczna, więc nie może przesłonić i wywołuje metodę w klasie Mini zamiast w samochodzie.

To dokładnie do tyłu.

c jest oświadczył jak Car, więc statycznych wywołań metody dokonany przez c wezwie metod zdefiniowanych przez Car.
Kompilator kompiluje c.m1() bezpośrednio do , nie wiedząc, że c rzeczywiście posiada Mini.

Dlatego nigdy nie powinieneś wywoływać metod statycznych przez takie instancje.

+4

+1 Dla * Dlatego nigdy nie powinieneś wywoływać metod statycznych przez takie instancje. * – Joffrey