"I said 2 as we are checking if the object is a dog; as dog is the class with the bark method in it, if it is then we call it which will print out :s"
La tua motivazione è corretta, ma non è così che funziona.
Java è un linguaggio tipizzato statico che significa che la validità dei metodi a cui un oggetto può rispondere è verificata al tempo di compilazione.
si potrebbe pensare il controllo:
if(a instanceof Dog)
farebbe, ma in realtà non è così. Che cosa fa il compilatore è controllare contro "l'interfaccia" del tipo dichiarato (Animale in questo caso). L '"interfaccia" è composta dai metodi dichiarati nella classe Animal.
Se il metodo dicorteccia() non è definito nella classe Super animali il compilatore dice: "Ehi, che non funzionerà".
Questo è utile, perché "a volte" facciamo errori di battitura durante la codifica (digitando Barck(), invece, per esempio)
Se il compilatore non non ci avverte di questo, si dovrebbe trovare in " runtime "e non sempre con un messaggio chiaro (ad esempio javascript in IE dice qualcosa come" oggetto inatteso ")
Ancora, il linguaggio tipizzato statico come java ci consente di forzare la chiamata. In questo caso si sta usando l'operatore "cast"()
Ti piace questa
1. Animal a = new Dog();
2. if (a instanceof Dog){
3. Dog imADog = (Dog) a;
4. imADog.bark();
5. }
In linea 3 vostro stanno "casting" per un tipo di cane in modo che il compilatore può controllare se la corteccia è un messaggio valido.
Questa è un'istruzione al compilatore che dice "Ehi sono il programmatore qui, so cosa sto facendo". E il compilatore, controlla, Ok, cane, può ricevere il messaggio abbaiare(), procedere. Tuttavia, se in runtime l'animale non è un cane, si verificherà un'eccezione di runtime.
Il cast potrebbe anche essere abbreviato come:
if(a instanceof Dog) {
((Dog)a).bark();
}
che verrà eseguito.
Quindi, la risposta corretta è 4: "la chiamata ad abbaiare causa un errore di compilazione"
Spero che questo aiuta.
suggerisce di cambiare la domanda qui "Le superclassi hanno i metodi delle loro sottoclassi?" o simili. –
Il trucco sta nel fatto che stai verificando che si tratti di un cane, ma il compilatore non stabilisce la connessione logica che a.bark verrà chiamata solo se a è un cane. Dovresti dire esplicitamente al compilatore di trattare un Like a Dog ai fini della chiamata alla bark(), come detto in seguito da Simon622. –
Per inciso, questo è il motivo per cui molte persone preferiscono "battere a macchina". In Python, il codice equivalente non avrebbe nemmeno bisogno di controllare se 'a' fosse un cane; Finché 'a' aveva un metodo' bark' quando veniva raggiunta quella linea, avrebbe funzionato. –