Herencia 2: Jugando con mensajes

En esta ocasión crearemos clases para ver el comportamiento de métodos heredados y sobrescritos de una clase Padre a una clase hija.


Primeramente creamos una clase llamada “Base” con un constructor el cual nos dice un mensaje, y un método llamado “mensaje”, también mostrará un mensaje.

public class Base {
        
        public Base(){
                JOptionPane.showMessageDialog(null,"Soy la clase Base");
        }
        
        public void mensaje(){
                JOptionPane.showMessageDialog(null,"Método de la clase Base");
        }
}

Recordar que hay que importar importjavax.swing.JOptionPane;


Ahora creamos la clase “DerivadaUno” que tendrá como padre a la clase “Base”, creamos su constructor y un método llamado “mensaje”.

public class DerivadaUno extends Base {

        public DerivadaUno (){
                super(); //Se puede omitir super(), ya que no pasamos parámetros
                JOptionPane.showMessageDialog(null,"Clase Derivada Uno");
        }
        public void mensaje(){
                JOptionPane.showMessageDialog(null,"Método de la clase DerivadaUno");
        }
        
        public void mensajePadre(){
                super.mensaje();
        }
        
}

Crearemos una tercera clase llamada “SubClaseUno” y ésta estará extendida de la clase “DerivadaUno”, también con un método llamado “mensaje”.

public class SubClaseUno extends DerivadaUno {

        public SubClaseUno(){
                super();
                JOptionPane.showMessageDialog(null,"Soy la subclase de DerivadaUno");
        }
        
        public void mensaje(){
                JOptionPane.showMessageDialog(null,"Método de la clase SubClaseUno");
        }
}

¡A Jugar con los mensajes!

Creamos una clase “Principal” con su método main para empezar a crear objetos y métodos y poder ejecutar el programa.

public class Principal {

        public static void main(String[] args) {

        }

}

Tal vez se pregunten: ¿Qué comportamiento se tiene al crear un objeto de una clase derivada? ¿Qué mensaje se deberá mostrar en el método mensaje, el del padre o el del hijo?


Veremos el comportamiento de los objetos y métodos.


Primeramente creo un objeto de la clase “Base”.


Base base=newBase();


Con el simple hecho de instanciar un objeto de la clase “Base” se mostrará un mensaje, ya que se definió en su constructor.

Podemos mandar llamar a su método “mensaje”.


base.mensaje();


Y obtenemos:


Hasta aquí todo bien, ahora crearemos un objeto de la clase “DerivadaUno” y la llamada a su respectivo mensaje.

DerivadaUno derivada=new DerivadaUno();
derivada.mensaje();

Ejecutamos y ¿que pasa?, primero nos muestra el mensaje del constructor de la clase padre y después los mensajes de su propia clase, pero ¿Porqué pasa esto?

Hay que recordar que el constructor de la clase padre se hereda automáticamente a una clase hija, por lo tanto se muestra el mensaje de la clase padre.


¿Qué pasara si creamos un objeto de la clase “SubClaseUno” ya que está heredada de “DerivadaUno” y esta a su vez de clase “Base”?


Así es, primero se muestra el mensaje del constructor de la clase “Base”, seguido del mensaje del constructor de la clase “DerivadaUno” y al final el mensaje del constructor de la clase “SubClaseUno”.


¿Porqué no se muestra el mensaje del método “mensaje()” la clase “Base” cuando llamo a el método “mensaje()” de la clase “DerivadaUno”?


Ésto es porque cada clase define sus propios atributos y métodos, aún siendo heredados la clase “DerivadaUno” sobrescribe el método “mensaje()” de la clase padre, si se quiere llamar al método “mensaje()” de la clase padre se tiene que preponer “super.mensaje().

public void mensajePadre(){
        super.mensaje();
}

y si lo llamamos nos muestra:

Ahora tenemos más claro el uso de super, y la forma en que se heredan los constructores y los métodos de las clases, sin embargo aún falta por conocer más sobre la herencia.