Herramientas de usuario

Herramientas del sitio


bloque3:polimorfismo

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
bloque3:polimorfismo [06/03/2018 09:28] – [Uso de polimorfismo] Fernando Valdeónbloque3:polimorfismo [16/09/2024 20:53] (actual) – editor externo 127.0.0.1
Línea 1: Línea 1:
 ====== Herencia: Polimorfismo ====== ====== Herencia: Polimorfismo ======
-El **polimorfismo** es otro de los pilares de la programación orientada a objetos, junto al **encapsulamiento, la abstacción, y la herencia**. Está completamente ligado al mecanismo de herencia.+El **polimorfismo** es otro de los pilares de la programación orientada a objetos, junto al **encapsulamiento, la abstracción, y la herencia**. Está completamente ligado al mecanismo de herencia.
  
-Básicamente consiste en acceder a una subclase mediante un tipo de datos de su superclase.+Básicamente consiste en acceder a métodos de una subclase mediante un tipo de datos de su superclase.
  
 ===== Concepto de polimorfismo ===== ===== Concepto de polimorfismo =====
-Viene del término de biología en el que un organismo puede tener diferentes formas. En programación orientada a objetos podemos tener un aparentemente un objeto que se comporta de modo distinto.+Viene del término de biología en el que un organismo puede tener diferentes formas. En programación orientada a objetos podemos tener aparentemente un mismo objeto que se comporta de formas distintas.
  
-Para explicar esto vamos a crear 3 clases: Vehiculo, Coche y Moto+De una forma resumida se puede decir que consiste en realizar un casting entre objetos: __una variable de una superclase puede almacenar referencias de objetos de sus subclases__. Podemos usar una variable de una superclase para acceder desde ella a métodos sobrescritos en la subclase.  
 + 
 +Para explicar esto vamos a crear 3 clases: Vehiculo (Superclase), Coche y Moto (Subclases)
 <code java> <code java>
 public Class Vehiculo{ public Class Vehiculo{
Línea 14: Línea 16:
    private String matricula;    private String matricula;
    ...    ...
-   public Vehiculo(String matricula, int potencia, int numRuedas){ 
-      this.numRuedas = numRuedas; 
-      this.potencia = potencia; 
-      this.matricula = matricula; 
-   } 
        
    public void mostrarEspecficaciones(){    public void mostrarEspecficaciones(){
Línea 35: Línea 32:
 public class Coche extends Vehiculo{ public class Coche extends Vehiculo{
    private int numPuertas;    private int numPuertas;
-    +   ... 
-   public Coche(String matricula, int potencia, int numRuedas, int numPuertas){ +      
-      super(matricula, potencia, numRuedas); +
-      this.numPuertas = numPuertas; +
-    +
-   public int getNumPuertas(){ +
-      return numPuertas; +
-   } +
-   +
    @Override    @Override
    public void mostrarEspecficaciones(){    public void mostrarEspecficaciones(){
Línea 55: Línea 45:
 public class Moto extends Vehiculo{ public class Moto extends Vehiculo{
    private String marca;    private String marca;
-    +   ...
-   public Moto(String matricula, int potencia, int numRuedas, String marca){ +
-      super(matricula, potencia, numRuedas); +
-      this.marca = marca; +
-   } +
-    +
-   public String getMarca(){ +
-      return marca; +
-   }+
        
    @Override    @Override
Línea 89: Línea 71:
 //Ejecuto el mismo método para los 3 vehiculos //Ejecuto el mismo método para los 3 vehiculos
 //El mismo método actúa de forma distinta //El mismo método actúa de forma distinta
-vehiculo1.mostrarEspecificaciones(); +vehiculo1.mostrarEspecificaciones(); //ejecuta el método de la clase Vehiculo 
-vehiculo1.mostrarEspecificaciones(); +vehiculo2.mostrarEspecificaciones(); //ejecuta el método de la clase Moto 
-vehiculo1.mostrarEspecificaciones();+vehiculo3.mostrarEspecificaciones(); //ejecuta el método de la clase Coche
  
  
Línea 101: Línea 83:
 </code> </code>
  
-Se puede llamar al método ''mostrarEspecificaciones()'' ya que es un método de la clase Vehículo. Cuando se ejecuta ese método primero se busca si existe en el objeto que tengo guardado en la variable, y sino existe buscaré en el de la superclase, y así sucesivamente, hasta la clase Object.+Se puede llamar al método ''mostrarEspecificaciones()'' ya que es un método de la clase Vehículo. Cuando se ejecuta ese método primero se busca si existe en el objeto que tengo guardado en la variable, y si no existebuscaré en el de la superclase, y así sucesivamente, hasta la clase Object.
  
-Sin embargo si desde una variable de la superclase ''Vehiculo'' quiero acceder a algún método de alguna subclase (getNumPuertas() ó getMarca()), no se permite, ya que no están definidos en esa clase.+Sin embargosi desde una variable de la superclase ''Vehiculo'' quiero acceder a algún método de alguna subclase (getNumPuertas() ó getMarca()), no se permite, ya que no están definidos en esa clase.
  
 Tampoco se permite almacenar un objeto de la superclase en una variable de una subclase: Tampoco se permite almacenar un objeto de la superclase en una variable de una subclase:
Línea 113: Línea 95:
 Como hemos visto, podemos referenciar objetos de una subclase mediante variable de un superclase. Como hemos visto, podemos referenciar objetos de una subclase mediante variable de un superclase.
  
-<code java>Vehiculo vehiculo1 = new Coche();</code>+<code java>Vehiculo vehiculo1; 
 +vehiculo1 = new Coche();</code>
  
 Esto se conoce como **UpCasting, o conversión hacia arriba** (desde una subclase a una superclase). Es un casting implícito y no es necesario indicar ninguna instrucción para realizar la conversión. Esto se conoce como **UpCasting, o conversión hacia arriba** (desde una subclase a una superclase). Es un casting implícito y no es necesario indicar ninguna instrucción para realizar la conversión.
Línea 131: Línea 114:
 Vehiculo vehiculo2 = new Moto(); Vehiculo vehiculo2 = new Moto();
  
-//No puedo llamar al método+//No puedo llamar al método de la clase Coche
 vehiculo1.getNumPuertas(); vehiculo1.getNumPuertas();
  
Línea 185: Línea 168:
  
 También tenemos el método ''getClass()'' heredado desde la clase ''Object'' que nos aporta una funcionalidad parecida. También tenemos el método ''getClass()'' heredado desde la clase ''Object'' que nos aporta una funcionalidad parecida.
 +<code java> 
 +if(vehiculo.getClass() == Coche.class){ 
 +   System.out.println("Es un coche"); 
 +
 +</code>
 ---- ----
  
 (c) {{date> %Y}} Fernando Valdeón (c) {{date> %Y}} Fernando Valdeón
bloque3/polimorfismo.1520328518.txt.gz · Última modificación: 16/09/2024 20:53 (editor externo)