Пример 1:Почему эти два примера кода производят разные выходы?
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();
}
}
Выход:
Gurrr! Gurrr! Moo!
Пример 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();
}
}
Выход:
Gurrr! Moo! Moo!
Я просто не понимаю, почему делает saySomething не-стат ic вызывает второй вызов saySomething, вызывающий версию Cow вместо версии Animal. Я понимаю, что Gurrr! Moo! Moo!
будет выходом в любом случае.
«Спецификация языка Java говорит так» - это действительно все. Почему вам разрешено вызывать статический метод из справки экземпляра, как в первую очередь, это настоящая странность. Но по крайней мере один огромный поток вики сообщества сообщества на этом :) – Affe