curso de java

Curso de Java
Desde cero hasta conexiones con bases de datos MySQL

Aplicación: página 2
[ 29, 30, 1, 2, 3, 4, 5 ]

Aplicación de ejemplo

Antes de programar

Herencia y polimorfismo

Para facilitar el diseño de una aplicación, se debe usar la herencia de la programación orientada a objetos. Para explicar este término, haremos otro Hola Mundo que usará una ventana, que contendrá una etiqueta; esto requiere tres clases de la librería swing: JFrame, JPanel y JLabel. Veamos la primera versión, sin orientación a objetos ni herencia, en la que las clases colaboran para lograr los objetivos:


DemoClasesColaborando.java



import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JLabel;

public class DemoClasesColaborando {    

    public DemoClasesColaborando() {

    	JFrame ventana= new JFrame();

    	JPanel panel=new JPanel();

    	JLabel etiqueta= new JLabel();

    	//Asigna un texto a la etiqueta

    	etiqueta.setText("Hola Mundo");

    	//Agrega la etiqueta al panel

    	panel.add(etiqueta);

    	//Agrega el panel a la ventana

    	ventana.add(panel);

    	//Ajusta el tamaño de la ventana al mínimo necesario

    	ventana.pack();

    	//Asigna el estado de visibilidad de la ventana a verdadero

    	ventana.setVisible(true);

    }

    public static void main(String[] args) {

        new DemoClasesColaborando();

    }

}

Después de compilar y ejecutar el código anterior, se presenta la siguiente ventana en la esquina superior derecha de la pantalla:

Curso de Java: Ejecutar

Cada una de las clases que estamos usando pertenece a tres ámbitos distintos: JFrame es una ventana que sirve como contenedor principal; JPanel es un contenedor de propósito general que se usará para albergar a los componentes como JLabel, o los botones, los campos de texto, etc. Todas están colaborando con la clase que acabamos de compilar (de ahí su nombre) para lograr el objetivo de mostrar en la etiqueta la cadena “Hola mundo”. Es posible continuar en este camino y agregar otros componentes al panel, más paneles a la ventana y, por supuesto, más componentes a cada uno de éstos nuevos contenedores. No obstante, esto es una mala práctica. Muy frecuentemente, es conveniente crear clases que al momento de declararlas obtengan todos los métodos y las propiedades de otra; a esto se le conoce como ‘herencia’ en la POO. De hecho, todas las clases (aun las que creamos nosotros) heredan de la clase Object si no se indica otra cosa; dicha clase tiene casi una docena de métodos que están disponibles incluso antes de que escribamos miembros con nuestra propia programación. Una de las ventajas de la herencia es que las clases se pueden ir especializando. Como ejemplo, presentamos enseguida todo el linaje de la clase JFrame:


Object

  ⊥ Component

     ⊥  Container

         ⊥  Window

             ⊥  Frame

                 ⊥  JFrame    

De tal manera que esta clase tiene todos los métodos de las que le anteceden, además de los propios (que, en total, resultan ser cientos). Este beneficio lo tienen todas las instancias de JFrame (incluida la que colabora en el programa anterior). Pero las ventajas de la herencia van más lejos. Sucede que si yo quiero tratar al objeto ventana como Object lo puede hacer, como se muestra en el siguiente código:


DemoVentanaComoObjeto.java

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JLabel;

public class DemoVentanaComoObjeto {    

    public DemoVentanaComoObjeto() {

    	JFrame ventana= new JFrame();//ventana es un JFrame

    	JPanel panel=new JPanel();

    	JLabel etiqueta= new JLabel();

    	//Tratamos a la ventana como Object

    	Object objetoVentana=ventana;//ventana también es un Object

    	/*Usamos el método getClass() de la clase Object 

    	 *y el getString () de Class para obtener 

    	 *el nombre de la clase a la que pertenece ventana

    	 */

    	String claseObjeto=objetoVentana.getClass().toString();    	

    	etiqueta.setText(claseObjeto);    	

    	panel.add(etiqueta);    	

    	ventana.add(panel);    	

    	ventana.pack();    	

    	ventana.setVisible(true);

    }

    public static void main(String[] args) {

        new DemoVentanaComoObjeto();

    }

}          

Este programa usa los métodos de la clase Object para obtener el nombre de la clase a la que pertenece el objeto ventana. Lo anterior significa que la herencia vuelve polimórficas a las clases: se les puede tratar como si fueran cualquiera de aquellas que están en su linaje (y de hecho son cada una de ellas).
Muy frecuentemente será conveniente hacer clases que hereden de otra. En un buen diseño, si necesitamos usar una ventana, conviene que la clase sea un JFrame. La herencia se logra con la palabra reservada extends escrita a reglón seguido después del nombre de la clase y sólo se puede heredar de otra. El código siguiente es nuestro tan traído Hola Mundo pero ahora usando los conceptos que estamos explicando.


DemoHeredaJFrame.java

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JLabel;

//Obsérvese la sintaxis de extends

public class DemoHeredaJFrame extends JFrame {    

    public DemoHeredaJFrame() {

    	/*Obsérvese que a estos tres métodos los usamos igual

    	 *aunque solo organizaComponentes()está escrito en

    	 *el bloque de código de la clase.

    	 *Los otros dos los heredamos de alguna de las clases

    	 *del linaje de JFrame

    	 */

    	organizaComponentes();    	

    	pack();    	

    	setVisible(true);

    }

    private void organizaComponentes(){

    	JPanel panel=new JPanel();    	

    	JLabel etiqueta= new JLabel();    	

    	etiqueta.setText("Hola mundo");

    	add(panel);

    	panel.add(etiqueta);    	

    }

    	

    public static void main(String[] args) {

        new DemoHeredaJFrame();

    }

}

En este caso hemos encapsulado la tarea de agregar los componentes de la ventana en un método para mostrar que, en términos de sintaxis, los métodos propios de las clases se portan igual que los heredados. Por otro lado, al haber extendido los alcances de nuestra clase para heredar los de JFrame, se convierte en parte su linaje; ahora es polimórfica porque es cada una de las que presentamos a continuación:


Object

  ⊥ Component

      ⊥ Container

          ⊥ Window

              ⊥ Frame

                  ⊥ JFrame

	                  ⊥ DemoHeredaJFrame      

      

[ Anterior | Siguiente ]