Sono confuso su come l'override differisca dal nascondersi in Java. Qualcuno può fornire maggiori dettagli su come questi differiscono? Ho letto il tutorial Java ma il codice di esempio mi ha lasciato ancora confuso.
Per essere più chiari, capisco bene l'override. Il mio problema è che non vedo come l'occultamento sia diverso, tranne per il fatto che uno è a livello di istanza mentre l'altro è a livello di classe.
Guardando il codice del tutorial Java:
public class Animal {
public static void testClassMethod() {
System.out.println("Class" + " method in Animal.");
}
public void testInstanceMethod() {
System.out.println("Instance " + " method in Animal.");
}
}
Quindi abbiamo una sottoclasse Cat
:
public class Cat extends Animal {
public static void testClassMethod() {
System.out.println("The class method" + " in Cat.");
}
public void testInstanceMethod() {
System.out.println("The instance method" + " in Cat.");
}
public static void main(String[] args) {
Cat myCat = new Cat();
Animal myAnimal = myCat;
Animal.testClassMethod();
myAnimal.testInstanceMethod();
}
}
Poi dicono:
L'output di questo programma è il seguente:
Metodo di classe in Animal.
Il metodo di istanza in Cat.
Per me, il fatto che chiamando un metodo di classe testClassMethod()
direttamente dalla Animal
classe esegua il metodo in Animal
classe è abbastanza ovvio, niente di speciale lì. Quindi chiamano testInstanceMethod()
da un riferimento a myCat
, quindi ancora abbastanza ovvio che il metodo eseguito in quel momento è quello nell'istanza di Cat
.
Da quello che vedo, la chiamata nascosta si comporta proprio come l'override, quindi perché fare questa distinzione? Se eseguo questo codice utilizzando le classi sopra:
Cat.testClassMethod();
Otterrò:
il metodo di classe in Cat.
Ma se rimuovo testClassMethod()
da Cat, ottengo:
Il metodo di classe in Animal.
Il che mi mostra che scrivere un metodo statico, con la stessa firma del genitore, in una sottoclasse fa praticamente un override.
Spero di chiarire dove sono confuso e che qualcuno possa fare luce. Grazie mille in anticipo!