2012-04-16 17 views

Respuesta

13

Puede tener un método que solo tome una instancia de SuperClass. Como SubClassesSuperClass, puede usar una instancia de SubClass y tratarla como SuperClass.

El mismo comportamiento se utiliza cuando se trabaja con interfaces:

List someList = new ArrayList(); 

Esa es la belleza de polimorfismo. Le permite cambiar la implementación de las partes internas de la clase sin romper el resto de su código.

+4

Lo más importante aquí es que 'SubClass' * es * a' SuperClass'. –

+0

¿Cambió este comportamiento en Java 8? Acabo de probar el caso en el que un método adopta un parámetro de superclase 'método de vacío (SuperClass param)' pero puedo poner en una instancia de subclase 'SubClass sub = new SubClass();' cuando lo llamo, como en 'method (sub); '. Esto significa que ahora se permite la compatibilidad ascendente? –

1

Todo lo que hace es decirle a la JVM cuál es el tipo de referencia en tiempo de compilación.

En el primer caso, usted dice que la referencia del objeto tiene el tipo estático de la superclase. Cuando crea un nuevo objeto de subclase, puede tener ese punto de referencia porque es una instancia de clase superior IS-A de subclase.

4

La razón principal para hacer lo anterior es para las llamadas a funciones que esperan la súper clase. Si usted tiene una clase A que tiene un método como éste

public static void insert(SuperClass b) { 
    //do something 
} 

y usted tiene la

SuperClass object = new SubClass(); 

que puede hacer

A.insert(object); 

Pero si lo hace

SubClass object new SubClass(); 

no puedes hacer

A.insert(object); 

a menos que añadir un método como este para un

public static void insert(SubClass b) { 
    //do something 
} 

Esto ayuda a reducir el código redundante o copiado y mantener las cosas más limpio.

12

Esto se conoce como polimorfismo. Imagínese el siguiente ejemplo:

Musician musician = new Pianist(); 

o

Musician musician = new Drummer(); 

Supongamos clase Musician tiene un método: play(). No importa quién sea el músico, si llama al método de reproducción, sabrá cómo tocar el instrumento determinado, basándose en la clase concreta, en este caso, sin importar si es pianista o batería.

Cada clase concreta, sobrescribiendo su método play(), puede jugar por su cuenta:

por ejemplo, Pianist de clase: play() { playsBeethoven(); }

Para obtener información detallada, por favor, compruebe http://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html

Siempre es bueno recordar para utilizarlo con la herencia http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

0

Esa es una de las principales razones por las que utilizar la herencia. Tratas a la Superclase como una abstracción y, en tiempo de compilación, no necesitas conocer el tipo derivado, o no es necesario que otra clase conozca el tipo derivado. Esto le permite usar referencias a SuperClass mientras usa polimorfismo para llamar a los métodos de la clase derivada.

Esto le permite a

a.) Crear fábricas de manera que no es necesario conocer el tipo en tiempo de compilación, y usted tiene algún método de ejecución que crea los tipos derivados. Piense en COM, GStreamer, DirectShow, Glib, etc ...

b.) Oculte la complejidad de otros objetos exponiendo únicamente las referencias de tipo base aunque sean instancias del tipo derivado. Piensa en los métodos que devuelven el objeto o toma una referencia de objeto como argumento.

c.) Muchas más posibilidades, pero esas son probablemente las dos más relevantes para usted.

Cuestiones relacionadas