Suscribirse al Feed
05Dic

[código] Programación Basada en Objetos (2)

(anterior) En esta sección se encuentran ejemplos más detallados de las clases. Muestra: la implementación de clases en Java, el acceso a los miembros de una clase, como implementar la ocultación de la información con modificadores de acceso, separar la interfaz de la implementación, usar métodos de acceso, separar la interfaz de la implementación, usar métodos de acceso y métodos utilitarios e inicializar objetos con constructores. También: el cómo declarar y utilizar constantes, la composición, la referencia con this, los miembros de la clase static y tipos de datos abstractos populares como pilas y colas. Al igual que se da un ejemplo introductorio al uso de paquetes (package) de Java.

Demostración de un objeto que tiene como miembro a otro objeto

Este ejemplo contiene 3 clases, la primera es Empleado:


// Empleado class declaration.

public class Empleado {
   private String primerNombre;
   private String apellidoPaterno;
   private Fecha fechaNacimiento;
   private Fecha fechaContratacion;

   // constructor para inicializar nombre, fecha de nacimiento y de contratación
   public Empleado( String nombre, String apellido, Fecha fechaDeNacimiento,
      Fecha fechaDeContratacion )
   {
      primerNombre = nombre;
      apellidoPaterno = apellido;
      fechaNacimiento = fechaDeNacimiento;
      fechaContratacion = fechaDeContratacion;
   }

   // convertir Empleado a formato de String
   public String aStringEmpleado()
   {
      return apellidoPaterno + ", " + primerNombre +
         "  Contratado: " + fechaContratacion.aStringFecha() +
         "  Fecha de nacimiento: " + fechaNacimiento.aStringFecha();
   }

} // fin de la clase Empleado

La segunda es Fecha:


// Declaración de la clase Fecha.

public class Fecha {
   private int mes;  // 1-12
   private int dia;    // 1-31 con base en el mes
   private int anio;   // cualquier año

   // constructor: llama a comprobarMes para confirmar el valor apropiado de mes;
   // llama a comprobarDia para confirmar el valor apropiado de dia
   public Fecha( int elMes, int elDia, int elAnio )
   {
      mes = comprobarMes( elMes ); // validar mes
      anio = elAnio;                 // podría validar anio
      dia = comprobarDia( elDia );       // validar dia

      System.out.println( "Constructor de objeto Fecha para la fecha " +
         aStringFecha() );

   } // fin del constructor de Fecha

   // método utilitario para confirmar el valor apropiado del mes
   private int comprobarMes( int mesPrueba )
   {
      if ( mesPrueba > 0 &amp;&amp; mesPrueba <= 12 )  // validar mes
         return mesPrueba;

      else { // mes es inválido
         System.out.println( "Mes inválido (" + mesPrueba +
            ") se establece en 1." );
         return 1;  // mantener el objeto en estado consistente
      }

   } // fin del método comprobarMes

   // método utilitario para confirmar valor apropiado de dia, con base en mes y anio
   private int comprobarDia( int diaPrueba )
   {
      int diasPorMes[] =
         { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

      // comprobar si el dia está dentro del rango del mes
      if ( diaPrueba > 0 &amp;&amp; diaPrueba <= diasPorMes[ mes ] )
         return diaPrueba;

      // comprobar si es año bisiesto
      if ( mes == 2 &amp;&amp; diaPrueba == 29 &amp;&amp; ( anio % 400 == 0 ||
           ( anio % 4 == 0 &amp;&amp; anio % 100 != 0 ) ) )
         return diaPrueba;

      System.out.println( "Día inválido (" + diaPrueba + ") se establece en 1." );

      return 1;  // mantener el objeto en estado consistente

   } // fin del método comprobarDia

   // devolver un String de la forma mes/día/año
   public String aStringFecha()

   {
      return mes + "/" + dia + "/" + anio;
   }

} // fin de la clase Fecha

Y la tercera es PruebaEmpleado, que contiene el método main:

// Demostración de un objeto que tiene como miembro a otro objeto.
import javax.swing.JOptionPane;

public class PruebaEmpleado {

   public static void main( String args[] )
   {
      Fecha nacimiento = new Fecha( 7, 24, 1949 );
      Fecha contratacion = new Fecha( 3, 12, 1988 );
      Empleado empleado = new Empleado( "Juan", "Pérez", nacimiento, contratacion );

      JOptionPane.showMessageDialog( null, empleado.aStringEmpleado(),
         "Prueba de la clase Empleado", JOptionPane.INFORMATION_MESSAGE );

      System.exit( 0 );
   }

} // fin de la clase PruebaEmpleado

Descargar código fuente

Ejemplos con variables de clase estática, el método de clase estático y memoria dinámica

Este ejemplo contiene 2 clases, la primera es Empleado:

// Declaración de la clase Empleado.
public class Empleado {
   private String primerNombre;
   private String apellidoPaterno;
   private static int cuenta = 0;  // número de objetos en la memoria

   // inicializar empleado, sumar 1 a la cuenta estática y
   // mostrar String indicando que se llamó al constructor
   public Empleado( String nombre, String apellido )
   {
      primerNombre = nombre;
      apellidoPaterno = apellido;

      ++cuenta;  // incrementar cuenta estática de empleados
      System.out.println( "Constructor de Empleado: " +
         primerNombre + " " + apellidoPaterno );
   }

   // restar 1 de la cuenta estática cuando el recolector de basura
   // llama a finalize para limpiar el objeto y mostrar String
   // indicando que se llamó a finalize
   protected void finalize()
   {
      --cuenta;  // decrementar cuenta estática de empleados
      System.out.println( "Finalizador de Empleado: " +
         primerNombre + " " + apellidoPaterno + "; cuenta = " + cuenta );
   }

   // obtener primer nombre
   public String obtenerPrimerNombre()
   {
      return primerNombre;
   }

   // obtener apellido
   public String obtenerApellidoPaterno()
   {
      return apellidoPaterno;
   }

   // método estático para obtener el valor de la cuenta estática
   public static int obtenerCuenta()
   {
      return cuenta;
   } 

} // fin de la clase Empleado

Y la segunda es PruebaEmpleado, que contiene el método main:

// Prueba de la clase Empleado con la variable de clase estática,
// el método de clase estático y memoria dinámica.
import javax.swing.*;

public class PruebaEmpleado {

   public static void main( String args[] )
   {
      // demostrar que cuenta es 0 antes de crear Empleados
      String salida = "Empleados antes de instanciar: " +
         Empleado.obtenerCuenta();

      // crear dos Empleados; la cuenta debe ser 2
      Empleado e1 = new Empleado( "Maria", "Flores" );
      Empleado e2 = new Empleado( "Juan", "Perez" );

      // demostrar que la cuenta es 2 después de crear dos Empleados
      salida += "\n\nEmpleados después de instanciar: " +
         "\nvia e1.obtenerCuenta(): " + e1.obtenerCuenta() +
         "\nvia e2.obtenerCuenta(): " + e2.obtenerCuenta() +
         "\nvia Empleado.obtenerCuenta(): " + Empleado.obtenerCuenta();

      // obtener nombres de Empleados
      salida += "\n\nEmpleado 1: " + e1.obtenerPrimerNombre() +
         " " + e1.obtenerApellidoPaterno() + "\nEmpleado 2: " +
         e2.obtenerPrimerNombre() + " " + e2.obtenerApellidoPaterno();

      // decrementar la cuenta de referencia para cada objeto Empleado; en este
      // ejemplo, hay sólo una referencia a cada Empleado, por lo que estas
      // instrucciones marcan a cada objeto Empleado para la recolección de basura
      e1 = null;
      e2 = null;  

      System.gc(); // sugerir una llamada al recolector de basura

      // mostrar cuenta de objetos Empleado después de llamar al recolector de basura; la cuenta
      // mostrada puede ser 0, 1 o 2 dependiendo de si el recolector de basura
      // se ejecuta inmediatamente o no y del número de objetos Empleado recolectados
      salida += "\n\nEmpleados después de System.gc(): " +
         Empleado.obtenerCuenta();

      JOptionPane.showMessageDialog( null, salida,
         "Miembros estáticos", JOptionPane.INFORMATION_MESSAGE );

      System.exit( 0 );
   }

} // fin de la clase PruebaEmpleado

Descargar código fuente

Inicialización de una variable final

// Inicialización de una variable final.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class PruebaIncremento extends JApplet implements ActionListener {
   private Incremento objetoIncremento;
   private JButton boton;  

   // configurar GUI
   public void init()
   {
      objetoIncremento = new Incremento( 5 );

      Container contenedor = getContentPane();

      boton = new JButton( "Haga clic para incrementar" );
      boton.addActionListener( this );
      contenedor.add( boton );
   }

   // sumar INCREMENTO al total cuando el usuario haga clic en el botón
   public void actionPerformed( ActionEvent eventoAccion )
   {
      objetoIncremento.incrementar();
      showStatus( objetoIncremento.aStringIncremento() );
   }

} // fin de la clase PruebaIncremento

// clase que contiene variable constante
class Incremento {
   private int cuenta = 0;       // número de incrementos
   private int total = 0;       // total de todos los incrementos
   private final int INCREMENTO; // variable constante

   // inicializar constante INCREMENTO
   public Incremento( int valorIncremento )
   {
      INCREMENTO = valorIncremento; // inicializar variable constante (una vez)
   }

   // sumar INCREMENTO al total y sumar 1 a cuenta
   public void incrementar()
   {
      total += INCREMENTO;
      ++cuenta;
   }

   // devolver representación String de los datos de un objeto Incremento
   public String aStringIncremento()
   {
      return "Después de incremento " + cuenta + ": total = " + total;
   }

} // fin de la clase Incremento

Descargar código fuente

Acceso de paquete de otras clases en el mismo paquete

// Las clases en el mismo paquete (es decir, el mismo directorio) pueden
// utilizar los datos con acceso de paquete, de otras clases en el mismo paquete.
import javax.swing.JOptionPane;
public class PruebaDatosPaquete {

   public static void main( String args[] )
   {

      DatosPaquete datosPaquete = new DatosPaquete();

      // anexar representación String de datosPaquete a salida
      String salida = "Después de instanciar:\n" +
         datosPaquete.aStringDatosPaquete();

      // cambiar los datos con acceso de paquete en el objeto datosPaquete
      datosPaquete.numero = 77;
      datosPaquete.cadena = "Adiós";

      // anexar la representación String de datosPaquete a salida
      salida += "\nDespués de cambiar valores:\n" +
         datosPaquete.aStringDatosPaquete();

      JOptionPane.showMessageDialog( null, salida, "Acceso a nivel de paquete",
         JOptionPane.INFORMATION_MESSAGE );

      System.exit( 0 );
   }

} // fin de la clase PruebaDatosPaquete

// la clase con variables de instancia con acceso de paquete
class DatosPaquete {
   int numero;     // variable de instancia con acceso de paquete
   String cadena;  // variable de instancia con acceso de paquete

   // constructor
   public DatosPaquete()
   {
      numero = 0;
      cadena = "Hola";
   }               

   // devolver representación String del objeto DatosPaquete
   public String aStringDatosPaquete()
   {
      return "numero: " + numero + "    cadena: " + cadena;
   }

} // fin de la clase DatosPaquete

Descargar código fuente

Los ejercicios utilizados en este post están basados en ejemplos del libro Cómo programar en Java de Deitel, y por lo tanto están bajo la licencia que esta editorial disponga.

1 Comentario para “[código] Programación Basada en Objetos (2)”

 

 

Antes de comentar... recuerda que no hago tareas

Te invito a subscribirte al feed RSS. ¿No sabes que es un lector de Feeds?

© 2007 - 2008 Dezinerfolio. Todos los derechos reservados.
Powered by Wordpress. Entradas RSS