2012-07-30 13 views
5

Mi sono imbattuto in qualche codice e non riesco a capire un certo aspetto di esso anche se ho fatto delle ricerche approfondite!Perché le parentesi sono usate attorno a un nome di classe in Java?

La mia domanda è: perché a volte le classi vengono dichiarate tra parentesi come nel seguente codice?

public class Animal { 

    public static void hide() { 
     System.out.println("The hide method in Animal."); 
    } 

    public void override() { 
     System.out.println("The override method in Animal."); 
    } 
} 

public class Cat extends Animal { 

    public static void hide() { 
     System.out.println("The hide method in Cat."); 
    } 

    public void override() { 
     System.out.println("The override method in Cat."); 
    } 

    public static void main(String[] args) { 
     Cat myCat = new Cat(); 
     Animal myAnimal = (Animal)myCat; 
     myAnimal.hide(); 
     myAnimal.override(); 
    } 
} 

dove la mia attenzione è su questa riga di codice, in particolare:

  Animal myAnimal = (Animal)myCat; 

credo che abbia qualcosa a che fare con il fatto che una classe estende un altro, ma sono sicuro ciò che la classe definita tra parentesi significa.

Qualsiasi aiuto su questo è apprezzato. Grazie in anticipo.

+0

È un typecast ma in questo caso il typecast non è necessario - poiché 'Cat' è un sottotipo di Animal. I tipi sono necessari quando si desidera assegnare un Super-tipo a un sottotipo, ad es. 'Cat cat = (Cat) someAnimal;'. Se lo fai dovrai assicurarti che nella variabile sia presente un 'Cat' o un sottotipo di' Cat', ad es. usando 'instanceof'. Altrimenti Java genererà un 'ClassCastException'. –

+0

in questo caso particolare, poiché Cat estende Animal e myAnimal è già Animal, non è necessario lanciare myCat in Animal. Quindi, Animal myAnimal = myCat; avrebbe funzionato – Shark

+0

parentesi '[]' - parentesi '{}' - parentesi '()' - "parentesi angolari" '<>' –

risposta

8

Quello che vedi è un cast per dire al compilatore che è giusto assegnare un gatto a un animale.

I cast sono per i casi in cui il compilatore non è in grado di convertire un tipo in un altro, perché non sa quali sono i tipi coinvolti o perché il cast perderebbe informazioni (ad esempio, se si ha un doppio che vuoi memorizzare in una variabile di tipo float). Nel tuo esempio il cast è totalmente inutile perché Cat estende Animal; poiché tutti i gatti sono animali, il compilatore non ha bisogno di un cast esplicito per dirgli che può assegnare un gatto a un animale.

7

Questo è un cast - la variabile myCat che è di tipo Cat viene trasmessa alla classe base Animal.

Ciò significa che può essere considerato un Animal.

Questa è una funzione di base di inheritance in Java.


Come @Sebastian Koppehelcommented, il cast in questo caso non è necessario - il myAnimal variabili (di tipo Animal) può accettare qualsiasi tipo che implementa Animal.

+1

E questa caratteristica di base dell'ereditarietà significa che il cast è * non necessario * in questa istanza. Hai bisogno di cast quando sai che un oggetto è di una certa classe ma il compilatore non può saperlo per qualche motivo. In questo caso il compilatore lo sa e il cast è solo zucchero sintattico. –

+0

Quindi il fatto che 'Cat' estenda 'Animal' rende il cast inutile? Cioè fa lo stesso lavoro? – Sidz

+0

@ Sadiq_S86 - In sostanza, sì. Il cast non è necessario. – Oded

0

Si garantisce esplicitamente al compilatore/runtime che il tipo di riferimento del gatto che si sta passando sia di tipo Animale. In Java, è chiamato come casting.

Durante il runtime se questo contratto non è rispettato (Ciò significa che non vi è alcuna relazione definita tra gatto e animale) si otterrà ClassCastException.

1

Anche se il codice produce un output corretto, se si deve eseguire il cast dell'oggetto su una classe genitore e quindi chiamare il metodo statico della classe genitore, è possibile che le classi debbano essere progettate in modo migliore. L'ereditarietà in Java dovrebbe fornire accesso a metodi e campi comuni. Se è necessario codificare un metodo statico in una classe Parent e chiamarlo utilizzando l'oggetto di classi figlio, la relazione tra classe genitore e classe figlio non è chiara.

Problemi correlati