Esempio 1:Perché questi due esempi di codice producono output diversi?
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();
}
}
uscita è:
Gurrr! Gurrr! Moo!
Esempio 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();
}
}
uscita:
Gurrr! Moo! Moo!
io proprio non capisco perché fare saySomething non-stat ic causa la seconda chiamata a sayqualcosa che richiama la versione Cow invece della versione Animal. La mia comprensione era che il Gurrr! Moo! Moo!
sarebbe stato l'output in entrambi i casi.
"La specifica del linguaggio Java dice così" è davvero tutto quello che c'è da fare. Perché sei autorizzato a chiamare un metodo statico da un riferimento di istanza come quello in primo luogo è la stranezza reale. Ma c'è già almeno un enorme thread wiki della comunità su questo :) – Affe