Próbka 1:Dlaczego te dwie próbki kodu dają różne wyniki?
class Animal {
public static void saySomething() { System.out.print(" Gurrr!");
}
}
class Cow extends Animal {
public static void saySomething() {
System.out.print(" Moo!");
}
public static void main(String [] args) {
Animal [] animals = {new Animal(), new Cow()};
for(Animal a : animals) {
a.saySomething();
}
new Cow().saySomething();
}
}
wyjściowa wynosi:
Gurrr! Gurrr! Moo!
Próbka 2:
class Animal {
public void saySomething() { System.out.print(" Gurrr!");
}
}
class Cow extends Animal {
public void saySomething() {
System.out.print(" Moo!");
}
public static void main(String [] args) {
Animal [] animals = {new Animal(), new Cow()};
for(Animal a : animals) {
a.saySomething();
}
new Cow().saySomething();
}
}
wyjściowa:
Gurrr! Moo! Moo!
ja po prostu nie rozumiem, dlaczego czyni saySomething nie-stat ic powoduje drugie wywołanie, mówiąc: Coś wywołuje wersję Cow zamiast wersji Animal. Rozumiem, że w obu przypadkach wynik będzie wynosił Gurrr! Moo! Moo!
.
"Specyfikacja języka Java mówi tak" to naprawdę wszystko. Dlaczego możesz wywołać metodę statyczną z takiego odniesienia do instancji, jak na początku, to prawdziwa dziwność. Ale jest już co najmniej jeden ogromny wątek wiki społeczności :) – Affe