2012-07-30 26 views
5

Encontré un código y no puedo entender un cierto aspecto de él aunque he realizado una búsqueda exhaustiva.¿Por qué se usan paréntesis alrededor de un nombre de clase en Java?

Mi pregunta es: ¿por qué las clases a veces se declaran entre paréntesis como en el siguiente código?

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(); 
    } 
} 

donde mi atención se centra en esta línea de código en particular:

  Animal myAnimal = (Animal)myCat; 

creo que tiene algo que ver con el hecho de que una clase se extiende otra, pero estoy seguro de lo que la clase definida dentro de paréntesis, significa.

Se agradece cualquier ayuda sobre esto. Gracias de antemano.

+0

Es un tipo encastrado, pero en este caso el encasillado no es necesario, ya que 'Cat' es un subtipo de Animal. Los tipos de difusión son necesarios cuando desea asignar un Súper Tipo a un Sub Tipo, p. Ej. 'Cat cat = (Cat) someAnimal;'. Si haces esto, tendrás que asegurarte de que en la Variable se incluye un 'Gato' o un subtipo de' Gato', p. usando 'instanceof'. De lo contrario, Java lanzará una 'ClassCastException'. –

+0

en este caso particular, ya que Cat extiende a Animal y myAnimal ya es Animal, no necesitas lanzar myCat a Animal. Entonces, Animal myAnimal = myCat; habría funcionado. – Shark

+0

corchetes '[]' - llaves '{} '- paréntesis'() '-" corchetes angulares "' <> ' –

Respuesta

8

Lo que está viendo es un molde para decirle al compilador que está bien asignarle un gato a un animal.

Los lanzamientos son para casos en los que el compilador no puede convertir de forma segura un tipo a otro, ya sea porque no sabe cuáles son los tipos involucrados o porque el elenco perderá información (por ejemplo, si tiene un doble que desea almacenar en una variable de tipo float). En tu ejemplo, el yeso es totalmente innecesario porque Cat extiende a Animal; dado que todos los Gatos son Animales, el compilador no necesita un lanzamiento explícito para decirle que puede asignar un Gato a un Animal.

7

Este es un molde - la variable myCat que es del tipo Cat se está convirtiendo a la clase base Animal.

Esto significa que se puede considerar como Animal.

Esta es una función básica de inheritance en Java.


Como @Sebastian Koppehelcommented, el elenco en este caso no es necesario - la variable myAnimal (de tipo Animal) puede aceptar cualquier tipo que implementa Animal.

+1

Y esta característica básica de herencia significa que el elenco es * innecesario * en este caso. Necesita lanzar cuando sabe que un objeto pertenece a cierta clase, pero el compilador no puede saberlo por algún motivo. En este caso, el compilador lo sabe y el yeso es solo azúcar sintáctico. –

+0

Entonces, ¿el hecho de que 'Cat' se extienda' Animal' hace que el lanzamiento sea inútil? Es decir. hace el mismo trabajo? – Sidz

+0

@ Sadiq_S86 - Esencialmente, sí. El yeso no es necesario. – Oded

0

Está garantizando explícitamente el compilador/tiempo de ejecución que el tipo de referencia de gato que está pasando es de tipo Animal. En java, se llama como casting.

Durante el tiempo de ejecución si no se respeta este contrato (Eso significa que no hay relación definida entre el gato y Animal) obtendrá ClassCastException.

1

Aunque el código produce resultados correctos, si tiene que convertir el objeto a una clase principal y luego llamar al método estático de la clase principal, las clases pueden necesitar diseñarse de mejor manera. Se supone que la herencia en Java proporciona acceso a métodos y campos comunes. Si uno necesita codificar un método estático en una clase para padres y llamarlo usando el objeto de las clases secundarias, entonces la relación entre la clase padre e hijo no es clara.

Cuestiones relacionadas