Muestra 1:¿Por qué estos dos ejemplos de código producen salidas diferentes?
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();
}
}
de salida es:
Gurrr! Gurrr! Moo!
Muestra 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();
}
}
Salida:
Gurrr! Moo! Moo!
Simplemente no entiendo por qué hacer saySomething no-stat ic provoca la segunda llamada para decir Algo invocar la versión Vaca en lugar de la versión Animal. Mi entendimiento fue que Gurrr! Moo! Moo!
sería la salida en cualquier caso.
"La especificación del lenguaje Java dice que sí" es realmente todo lo que hay que hacer. Por qué se le permite llamar a un método estático desde una referencia de instancia como esa en primer lugar es la rareza real. Pero ya hay al menos un enorme hilo wiki de la comunidad sobre eso :) – Affe