jueves, 31 de mayo de 2012

La clase Graphics

Casi todas las componentes y contenedores de Swing tienen un método paint(g) asociado que sirve para dibujarlos en pantalla. Java invoca este método automáticamente cuando tiene que mostrar, de forma estándar, la componente o contenedor en cuestión (esto es, sus bordes, su título, si lo tiene, etc.)
El método paint(g) se redefine cuando se quiere que estos elementos tengan un aspecto particular, por ejemplo, cuando se quiere dibujar algo específico sobre ellos.
El método paint(g) es de la forma

public void paint(Graphics g) {
...
}

Donde g es un objeto de la clase abstracta Graphics. Todo contenedor o componente que se pueda dibujar en pantalla tiene asociado un objeto g de esta clase, con la información sobre el área de la pantalla que el

lunes, 28 de mayo de 2012

JDBC: Conexión con Base de Datos

¿Que es JDBC?
      JDBC es el acrónimo de Java Database Connectivity, una API  que permite la ejecución de operaciones sobre bases de datos desde el lenguaje de programación JAVA, independientemente del sistema operativo donde se ejecute o de la base de datos a la cual se accede utilizando el lenguaje SQL del móldelo de base de datos que se utilice.
      Esta conformada por diversas clases e interfaces ubicadas en el paquete java.sql.

La necesidad de una librería
      Al trabajar con JDBC resulta necesario agregar un jar al proyecto que contiene las clases necesarias que se utilizan para “dialogar” con un DBMS. Cada DBMS tiene su propio archivo jar. Estos archivos se pueden obtener de:

      -http://developers.sun.com/product/jdbc/drivers

También es posible conseguir estos archivos jar en la página web correspondiente a cada DBMS, por ejemplo, en caso de usar DMBS Oracle es posible buscarlo en la página de Oracle: www.oracle.com. En nuestro caso vamos a usar el jar de MySQL, el MySQL connector y lo podemos descargar desde acá:


Dentro del zip que se descarga se encuentra el jar.

Conexión con la base de datos

-La interfaz Connection
      Para poder trabajar con una base de datos, el punto de partida siempre es conseguir una conexión, es decir un objeto de tipo Connection (este objeto pertenece a una clase que implementa la interfaz Connection).

Base de Datos


El lenguaje SQL

      El Lenguaje de Consulta Estructurado (SQL = Structured Query Language) es un lenguaje declarativo de acceso a bases de datos relacionales que permite especificar diversos tipos de operaciones sobre las mismas. Una de sus características es el manejo de algebra y el calculo relacional permitiendo lanzar consultas con el fin de recuperar información de interés de una base de datos, de una forma sencilla.
      El SQL es un lenguaje de acceso a bases de datos que explota la flexibilidad y potencia de los sistemas relacionales permitiendo gran variedad de operaciones sobre los mismos. Es un lenguaje declarativo de alto nivel, que gracias a si fuerte base teórica y si orientación al manejo de conjuntos de registros, y no a registros individuales, permite una alta productividad en codificación.
      Es el lenguaje utilizado universalmente para interactuar con base de datos, permitiendo realizar consultas, inserciones, actualizaciones y eliminaciones de datos, como así también de base de datos.

La interfaz Gráfica


La historia: AWT

         Fue definido como un conjunto de paquetes inicialmente, para la construcción de interfaces graficas. Esta basado en contenedores gráficos mas componentes gráficos, mas modelo de eventos. Los componentes de AWT están implementados en código nativo, es decir que están restringidos a las características de la plataforma.
         Por ejemplo si la plataforma no permite imágenes en los botones, entonces no será posible construir un botón con una imagen en lugar del texto. La mayoría de los componentes de AWT son subclases de Component, excepto los contenedores de mayor nivel como Frame, Dialog y Applet.

Estructura de una aplicación AWT

         Los componentes de AWT están dentro del paquete java.awt. Todo componente se utiliza dentro de un java.awt.Frame. La pantalla a construir será una subclase de java.awt.Frame. La pantalla estará compuesta por:
         Los atributos, que son componentes gráficos. Los métodos, que manejan los eventos que ocurren sobre los componentes gráficos. El método initComponent(), método llamado por el constructor donde se inicializan todos los componentes gráficos.

La actualidad: Swing

         Swing, nombre del proyecto dedicado a la construcción de componentes gráficos. Si bien ha

lunes, 21 de mayo de 2012

Streams

Definición
      Un Streams es un medio utilizado para leer datos de una fuente y para escribir datos en un destino. Tanto la fuente como el destino pueden ser archivos, sockets, memoria, cadena de caracteres, y también procesos.
      Los Streams se caracterizan por se unidireccionales, es decir que un Stream se utilizara solo para leer, solo para escribir, pero no ambas acciones al mismo tiempo.
      Para utilizar una Stream, el programa a realizar deberá construir el Stream relacionándolo directamente con una fuente o con un destino, dependiendo si se necesita leer o escribir información.
      La acción de leer información de una fuente es conocida también como input, y la acción de escribir información es un destino es conocida como output. Dentro de Java, todas las clases utilizadas tanto para el input como para el output están incluidas en el paquete Java.io

viernes, 18 de mayo de 2012

Excepciones


Definición

           
Una excepción que no fue capturada correctamente hace que el sistema se caiga. Una excepción es un evento que ocurre durante la ejecución de un programa, que interrumpe el flujo normal de ejecución.
                Java usa excepciones para el manejo de errores, error handling. Es un sinónimo de eventos excepcionales. Un buen manejo de Excepciones hace a un sistema robusto y estable, confiable.

Iteradores (Recorrido de Contenedores)


Es un patrón de diseño utilizado para recorrer las colecciones. En java es una interfaz denominada Iterator. Esta formado por 3 métodos:

ü  boolean hasNext(): retorna true en caso de haber mas elementos y false en caso de llegar al final de iterator
ü  Object next(): retorna el siguiente elemento en la iteración
ü  void remove(): remueve el ultimo elemento devulto por la iteración

En las clases Vector, ArrayList, HashSet y TreeSet un iterador se consigue a través del método: Iterator iterator(). Se utiliza de la siguiente manera:

Contenedores (Colecciones)


Definición:
     Los contenedores son el modo de agrupar objetos. También llamados colecciones (Collection). Representa a un conjunto de ítems, un conjunto de objetos, que pueden ser homogéneos o no. Por ejemplo, una agenda es una colección de datos de personas.

lunes, 14 de mayo de 2012

Conceptos Generales (Comparación entre objetos)


El operador ==

      Este operador esta sobrecargado para operar con objetos. Se utiliza para saber si dos punteros apuntan al mismo objeto, es decir que son dos referencias de la misma instancia de objeto. Retorna true o false según el resultado de la comparación.
      Ejemplo:

         String c1 = new String (“Juan”);
         String c2 = c1;
        
         if (c1==c2){
         System.out.println(“c1 y c2 apuntan al mismo objeto”);
         }

En este caso se va a informar que apuntan al mismo objeto ya que el resultado de la comparación es true.

El método equals()

      Se utiliza para saber si dos objetos son iguales, si el contenido es igual. Esta redefinido por la subclase que lo utiliza. En la clase String se utiliza para saber si dos objetos String son iguales.
      En la clase Integer se utiliza para saber si dos objetos Integer son iguales. Retorna true  o false según el resultado de la comparación.
      Ejemplo:

         String c1 = new String (“Juan”);
         String c2 = new String (“Pedro”);

         if(c1.equals(c2)){
         System.out.println(“c1 y c2 son iguales”);
         }


En este caso no se va a informar nada ya que no es true el resultado de la comparación.

Conceptos Generales (Wrappers de tipos de dato primitivos)


Definición

      Es la representación de los valores primitivos como objetos, son utilizados para envolver los tipos de datos primitivos. En general tienen dos constructores:

      - Con los valores primitivos como parámetros.
      - Con los valores primitivos como cadena de caracteres, como parámetro.

Tienen un método estático valueOf() que retorna un objeto Wrapper(Integer, Long, Double, Float, etc). 

La clase Integer

      Utilizada para envolver el tipo de dato prmitivo int. Es una subclase de java.lang.Number.

      Ejemplo en Java:

         Integer miEntero = new Integer(50);
         Integer miOtroEntero = Integer.valueOf(“50”);

La clase Float

      Utilizada para envolver el tipo de dato primitivo float. Es una subclase de java.lang.Number.

      Ejemplo en Java:

         Float miPuntoFlotante = new Float(45.67);
         Float miOtroPuntoFlotante = Float.valueOf(“45.67”);

La clase Number

      Representa el concepto abstracto de un numero en Java. Tiene como objetivo ser la superclase de los Wrappers de los tipos de datos numéricos primitivos. Es una clase abstracta, es decir no se puede instanciar.

Conceptos Generales (La clase System)

Definición:
     
      La clase System representa al sistema donde se esta ejecutando el programa Java. Por lo tanto se la puede utilizar para interactuar con el entorno en el que corre, y utilizar las propiedades del entorno, sistema operativo, usuario y demás.

Donde utilizarla:

      Puede accederse a la salida estándar del proceso, a la salida de error del proceso y a la entrada estándar del proceso mediante, System.out, System.err, System.in respectivamente, de modo de poder interactuar con el sistema operativo. También permite obtener el tiempo en milisegundos llamando al sistema operativo para lograr este objetivo.
      Otra cosa muy útil de la clase System es que permite cargar librerías externas en una línea de ejecución con el método load (), mediante esta operación se logra cargar librerías en tiempo de corrida del programa y suma así funcionalidades a nuestros programas.
      Posee atributos y métodos de uso general, y son todos estáticos, es decir atributos y métodos de clase. No es una clase instanciable.

Entre los métodos mas conocidos están:

 ü  exit() à termina la ejecución de la JVM

 ü  gc() à invoca al Garbage Collector

 ü  getProperties() à trae todas las propiedades del sistema

 ü  getProperty() à trae una propiedad en particular del sistema

Conceptos Generales (La clase String)


Definición
     
      La clase String es utilizada para manejar cadenas de caracteres. El operador + se utiliza para concatenar Strings.
      Entre los métodos mas conocidos esan charAt(), equals(), length(), replaceAll().

Inicialización de un String

      Las formas de declarar e inicializar un objeto de la clase String son las siguientes:

         String cadena1 = “Soy una cadena de caracteres”;
         String cadena2 = new String (“Soy una cadena de caracteres”);

         char [] caracteres  = {‘h’, ‘o’, ‘l’, ‘a’};
         String cadena3 = new String (caracteres);


      Todos los objetos en Java heredan de la clase Object, y la clase Object tiene un método toString() que nos retorna la representación del objeto en un String.
      Este método se puede sobrescribir de modo tal que la información que se retorne en el String resultado sea propia de la instancia de la clase.

      Ejemplo:

         public class Auto{

                prívate String patente;
                prívate String marca;
                prívate String modelo;

                //Aca van los constructores

                //Aca van los setters y getters

                //El método siguiente es el retorna el objeto Auto como un String
                @Override
                public String toString(){
                return “Patente: ” + this.patente + “\nMarca: ” + this.marca + “\nModelo: ” + this.modelo;
                }
         }


Métodos mas importantes

La clase String también tiene los siguientes métodos:

 ü  compareTo(String) à compara un String con otro por igualdad.

 ü  concat(String) à concatena un String con otro.

 ü  contains() à evalua si una cadena de caracteres esta contenida en el String

 ü  startsWith(String prefijo) à evalua si el String comienza con el prefijo

 ü  endsWith(String sufijo) à evalua si el String termina con el sufijo

 ü  valueOf() à convierte cualquier tipo básico, boolean, long, doublé, int, en un String.

 ü  Split (String expresionRegular) à separa en partes según la expresión regular.

 ü  subString(int comienzo, int fin) à retorna un bloque desde comienzo y hasta fin.

 ü  Matches(String expresionRegular) à evalua si el String contiene la expresión regular. 

Accesibilidad


Acceso privado, palabra clave “private”

      Al definir un atributo, método o clase como privado, se le esta dando acceso solo desde la clase donde fue definido. Por ejemplo, en el caso de velocidad de un Auto:

         public class Auto{

               private int velocidad;

               public void acelerar(){
               this.velocidad += 10;
               }
        
         }

      Por lo tanto el único modo de acceder a modificar la velocidad es a través del método acelerar. Esta propiedad no esta accesible desde ningún otro alcance sino el de la clase.
      Para poder acceder al atributo velocidad, solo podrán hacerlo los métodos de la misma clase.

Acceso por defecto, “default” o “package”

      En el caso del acceso por defecto, que es el acceso cuadno no se declara la accesibilidad a un atributo, método o clase, el acceso es dentro del mismo paquete o directorio. Por ejemplo si tengo dos clases Auto y Camion, y auto tiene un conductor sin definir su accesibilidad, es decir:

         package vehículos;
        
               public class Auto extends Vehiculo{
        
                               Conductor getConductor(){
                               //Acá se retorna el conductor
                               }
         }
   
Luego en la clase Camion que esta en el mismo package:

      package vehículos;
     
      public class Camion extends Vehiculo{
        
         public void comunicar(Vehiculo v){
         v.getConductor().conversar(); //Se tiene acceso a getConductor por estar ambas clases en el mismo package.
         }

      }


Para poder acceder al método getConductor() podrán hacerlo únicamente las clases ubicadas en el mismo package o directorio.

Acceso protegido, palabra clave “protected”

      Al definir un atributo o método como protegido estamos dejándolo disponible para las clases que heredan de esta clase, ejemplo:

         public class Vehiculo{
               protected int cantidadDeRuedas = 4;
         }

      Luego en la clase Auto, tendremos acceso a cantidadDeRuedas:

         public class Auto extends Vehiculo{
               
                public int getCantidadDeRuedas(){
                return this.cantidadDeRuedas;
                }
         }


      Para poder acceder al atributo cantidadDeRuedas, solo podrán hacerlo las clases que heredan de Vehiculo, es decir la familia de clases.

Acceso publico, palabra clave public

      Definiendo un atributo o método o clase como público permite que se tenga acceso a estos desde cualquier alcance, desde todos lados.
      Acceder a los atributos públicos, todos podrán hacerlo.

Resumen de accesibilidad

Accesibilidad
Acceso en la misma clase
Acceso en el mismo package
Acceso en el árbol de herencia
Acceso desde todas las clases
private
Si
No
No
No
default o package
Si
Si
No
No
protected
Si
Si
Si
No
public
Si
Si
Si
Si

La keyword Final


Definición:

      Es una palabra reservada de Java. Tiene una semántica distinta según donde se la utilice.

Aplicable a atributos:

      Aplicada en atributos representa a un valor constante.
      Ejemplo:

         public final int valorCuota = 100;

      Este valor no puede ser modificado en ningún momento  de la programación. Es un valor constante que no se modifica.

Aplicable a métodos:

      Aplicada en métodos representa la no modificación de un método en el caso de querer sobrescribirlo en una clase.
      Ejemplo:

         public final void moverPieza(){
         }

      En caso de heredar de esta clase, no se podrá sobrescribir el método moverPieza(), quedara con su comportamiento original y no se puede modificar.

Aplicable a clases:

      Aplicada en clases significa que esa clase no se puede extender o no se puede hacer una subclase, es decir que no se puede generar una clase que herede de ella. Cierra el árbol de herencias y queda como una hoja de este árbol.
      Ejemplo:

         public final class Hombre{
         }

      Esta técnica puede ser utilizada cuando se entrega una librería o parte de un programa y se quiere que, quien utilice estas clases, no pueda heredar de estas clases para modificar su comportamiento. Es una medida de seguridad al compartir código o publicar programas.

viernes, 11 de mayo de 2012

Paquetes


¿Que es un paquete?

      Un paquete es un medio de organización de clases, para agrupar clases e interfaces. Se suelen crear a partir de necesidades funcionales. Pueden contener clases, interfaces y más.
Ejemplo en Java de definición de paquetes:

      package mipaquete.misubpaquete;
     
      public class Persona{
      }

Utilización

      A continuación se presenta un ejemplo en Java de como utilizar un paquete desde una clase ubicada en otro paquete:

      import mipaquete.misubpaquete.*;

La asociación directa es que una clase o una interface esta definida en un archivo. Todo archivo debe contener una clase pulica al menos, y esta debe tener el mismo nombre que el archivo.

Estas clases e interfaces, estos archivos deben vivir dentro de paquetes, que son equivalentes a los directorios, es decir que la clase Persona, que es publica y esta en el archivo Persona.java, debe existir dentro del paquete entidades, es decir el archivo debe vivir dentro del directorio entidades.
Ejemplo:
         /entidades/Persona.java

Interfaz


¿Que es?

      Una interfaz es una declaración de comportamiento, es decir un conjunto de métodos sin su implementación. Define un protocolo de comportamiento. Es un contrato que publica una clase para ser utilizada por otras clases. Puede heredar de otras interfaces.

Ejemplo en Java:

    
public interface Imprimible {
        
         public void imprimir ();
         public void imprimir (Tamaño t, Estilo e);
      }

Utilizacion:

    
public class Documento implements Imprimible{

         public void imprimir(){
         //Acá va la definición.
         }

         public void imprimir(Tamaño t, Estilo e){
         //Acá va la definición.
         }
      }

Ejemplo de mini programa con interfaces:

public class Aeropuerto {
    
    public void darPermisoDeAterrizaje(Volador v){
        
       /*
       Aca va el codigo de despejar pista y permitir aterrizar al volador v
       En el programa se puede iterar sobre una lista de voladores e ir dando
       permiso de aterrizaje a cada volador, sin especificar que tipo 
       especifico de volador se trata 
       */
       
        v.aterrizar();
        
        if(v instanceof AvionPrivado){
            AvionPrivado ap = (AvionPrivado)v;
            System.out.println("Aterrizo Licencia " + ap.getLicencia());
        }
        
         if(v instanceof AvionDePasajeros){
            AvionDePasajeros adp = (AvionDePasajeros)v;
            System.out.println("Aterrizo Licencia " + adp.getAerolinea());
        }
         
       if(v instanceof Superman){
            Superman sp = (Superman)v;
            System.out.println("Aterrizo Licencia " + sp.getNombre());
        }
        
    }
}


Luego tenemos distintos TransportesAereos, un AvionDePasajeros, un AvionPrivado y luego tenemos a Superman.
Entonces lo que se hace es utilizar la interfaz para definir un mismo comportamiento a clases bien distintas, porque no heredan de la misma clase genérica.

public interface Volador {
    //Obligamos a cada volador a programar su modo de aterrizar
    public void aterrizar();
}

public abstract class TransporteAereo {
 }

class AvionPrivado extends TransporteAereo implements Volador{
    
    private String licencia;
    
    @Override
    public void aterrizar() {
      //Aca va el codigo del modo que tiene que aterrizar un avion privado
    }
    
    public String getLicencia() {
        return licencia;
    }
    
     public void setLicencia(String licencia) {
        this.licencia = licencia;
    }
     
}

class AvionDePasajeros extends TransporteAereo implements Volador{

    private String aerolinea;
    
    @Override
    public void aterrizar() {
    //Aca va el codigo del modo que tiene que aterrizar un avion de pasajeros
    }
    
    public String getAerolinea() {
        return aerolinea;
    }
    
     public void setAerolinea(String licencia) {
        this.aerolinea = licencia;
    }
}

class Superman extends TransporteAereo implements Volador{

    @Override
    public void aterrizar() {
    //Aca va el codigo del modo que tiene que aterrizar de Superman
    }
    
    public String getNombre() {
        return "Clark Kent";
    }
    
}



public class Programa {
    public static void main(String[] args) {
        
        AvionPrivado v1 = new AvionPrivado();
        v1.setLicencia("L123456F");
        
        AvionDePasajeros v2 = new AvionDePasajeros();
        v2.setAerolinea("Aerolineas Args");
        
        Superman v3 = new Superman();
        
        Aeropuerto ap = new Aeropuerto();
        
        ap.darPermisoDeAterrizaje(v1);
        
        ap.darPermisoDeAterrizaje(v2);
        
        ap.darPermisoDeAterrizaje(v3);
    }
}


En este caso se ve como se puede llamar al método aterrizar () de los objetos Voladores, porque la interfaz Volador tiene un método aterrizar () y al implementar una interfaz se esta diciendo que se tendrá ese comportamiento, es decir que se implementan sus métodos.

jueves, 10 de mayo de 2012

Clase Abstracta


Definición:

      Una clase abstracta representa un concepto abstracto que no debe ser instanciado. Es simplemente una clase que no se puede instanciar. Sirve como base para que otras clases hereden de ella sus atributos y métodos, pero no tiene sentido por si sola como instancia. Los métodos abstractos no pueden estar definidos en la clase.
      Pero deben ser obligatoriamente definidos en las subclases

Ejemplo en Java:

      public abstract class Persona{   
                 //Atributos
                 private String nombre;
                  private Date fechaDeNacimiento;   
                   //Metodos
                  public abstract void estudiar();
                 public String getNombre(){
                                 return this.nombre;
                   }
      }

Utilizacion:

         public class Hombre extends Persona{   
         //Metodo que se implementa obligatoriamente
        //por estar definido como abstracto en la clase padre
         @Override
            public void estudiar(){
                  //Aca va el codigo de estudiar.
             }   
        }

Polimorfismo


Definición

      El polimorfismo se produce cuando un método adopta más de una forma. Un método puede modificar su comportamiento de acuerdo a su necesidad.

Como ejemplo se puede utilizar lo siguiente:

class Numero {   
    protected int numero;           
    public void proximo(){       
    }   
    @Override
    public String toString(){
        return " " + numero;
    }
}
    class NumeroPositivo extends Numero{       
        public NumeroPositivo(){
          numero = 0;
        }       
        public void proximo(){
        numero = numero + 1;
        }
    }   
    class NumeroNegativo extends Numero{       
        public NumeroNegativo(){
            numero = 0;
        }       
        public void proximo(){
        numero = numero - 1;
        }
    }

public class Programa {         
        public static void main(String[] args) {           
            Numero positivo = new NumeroPositivo();
            Numero negativo = new NumeroNegativo();
            System.out.println("Numero positivo inicial:" + positivo);
            System.out.println("Numero negativo inicial:" + negativo);
            positivo.proximo();
            negativo.proximo();
            System.out.println("Numero positivo siguiente:" + positivo);
            System.out.println("Numero negativo siguiente:" + negativo);
            positivo.proximo();
            negativo.proximo();   
            System.out.println("Numero positivo siguiente:" + positivo);
            System.out.println("Numero negativo siguiente:" + negativo);
            }
}

El resultado de este programa es el siguiente:

Numero positivo inicial: 0
Numero negativo inicial: 0
Numero positivo siguiente: 1
Numero negativo siguiente: -1
Numero positivo siguiente: 2
Numero negativo siguiente: -2

La conclusión que debemos observar en este ejemplo es que se tienen dos instancias de Numero, una instancia de NumeroPositivo y una de NumeroNegativo, cada cual tiene un comportamiento distinto. Sin embargo a la hora de declararlo se los declaro en su forma genérica de Numero y se tiene el método próximo () asociado.

El polimorfismo ha permitido que cada uno se comporte de manera distinta, y sin embargo parece llamarse siempre al mismo método. Es decir, es distinto el próximo negativo del próximo positivo, y eso se refleja en el resultado.

Otra cosa que puede verse en este ejemplo es que al imprimir los objetos positivos y negativos se llama automáticamente al método toString (), es el modo en el que Java imprime sus objetos en pantalla. Y el aprovechamiento del mecanismo de herencia, en la programación del método toString () que retorna el valor de numero como un String, es decir, algo que puede imprimirse fácilmente. Al llamarlo en un NumeroPositivo, como este no lo tiene programado, se ejecuta el que esta definido en la clase padre Numero. Al llamarlo en un NumeroNegativo también se llama al de la clase padre.

Con redefinición:

Se llama polimorfismo con redefinición cuando en una clase sobreescribimos un método, definido en la superclase.

Ejemplo en Java:

      public class Persona{
               public void cantar(){
                                //Esto es un comentario. Aca va la definicion.
                }
      }
      class Cantante extends Persona{
                 public void cantar(){
                               //Esto es un comentario. Aca va la redefinicion.
                 }
      }

En este caso se puede ver que todas las personas pueden cantar (), sin embargo no es lo mismo cantar () en la clase Cantante, pues el cantante logra mayor escala, mayor volumen de voz, y entona de una forma muy preparada. Un cantante logra llegar más lejos con su canto que una persona común. Al redefinir el método en la clase Cantante se logra que se ejecute el método cantar () de cantante en lugar de método cantar () de persona. Por lo tanto la especialización que se logra con este mecanismo permite cambiar el comportamiento de una familia de clases.

Sin Redefinición

Se llama polimorfismo sin redefinición cuando un método tiene distinto comportamiento de acuerdo a la clase a la que pertenece.

Ejemplo en Java:

      public class Persona{
                               public void beber(Agua unPocoDeAgua){
                                 //Esto es un comentario. Aca va la definicion.
                                 }
      }

      class Animal{
                   public void beber(Agua unPocoDeAgua){
                               //Esto es un comentario. Aca va otra definicion.
                               }
      }

En este caso ambas clases logran beber (), es decir que ambas clases tienen definido el método beber, solo que uno de los métodos beber lo hace como humano, y otro lo hace como un animal, el comportamiento es bien distinto, aunque el nombre sea el mismo.

lunes, 7 de mayo de 2012

Casteos


Definición:
      El casteo (casting) es un procedimiento para transformar una variable primitiva de un tipo a otro, o transformar un objeto de una clase a otra clase siempre y cuando haya una relación de herencia  entre ambas.
      Existen distintos tipos de casteo (casting) de acuerdo a si se utilizan tipos de datos o clases.

Casteo Implícito (Widening Casting)
      El casteo implícito radica en que no se necesita escribir código para que se lleve a cabo. Ocurre cuando se realiza una conversión ancha – widening casting – es decir, cuando se coloca un valor pequeño en un contenedor grande.
      Ejemplo:
               
                //Define una variable de tipo int  con el valor 100
                int numeroEntero = 100;
                //Define una variable de tipo long a partir de un int
                long numeroLargo = numero;

Casteo Explicito (Narrowing Casting)
      El casteo explicito se produce cando se realiza una conversión estrecha – narrowing casting – es decir, cuando se coloca un valor grande en un contenedor pequeño. Son susceptibles de perdida de datos y deben realizarse a través de código fuente, de forma explicita.
      Ejemplo:
               
                //Define una variable del tipo int con el valor 250
                int numeroEntero = 250;
                //Define una variable del tipo short y castea la variable numero
                short s = (short) numero;

Upcasting

El upcasting se produce a nivel objetos. Suponiendo que existe una clase Empleado y clase Ejecutivo, la cual es una subclase de esta. Un Ejecutivo entonces ES UN Empleado y se puede escribir de la siguiente forma:
     
      //Instancia un ejecutivo en una variable de tipo Empleado
      Empleado e1 = new Ejecutivo (“Maximo Dueño”, 2000);

A esta operación en donde un objeto de una clase derivada se asigna a una referencia cuyo tipo es alguna de las superclases se la denomina upcasting.
Cuando se realiza este tipo de operaciones, hay que tener cuidado porque para la referencia e1 no existen los atributos y métodos que se definieron en la clase Ejecutivo, aunque la referencia apunte a un objeto de este tipo.
Por el contrario, si ahora existe una variable de tipo Empleado y se desea acceder a los métodos de la clase derivada – suponiendo  que contiene un método ejecutarPlanificacion() en la clase Ejecutivo – teniendo una referencia de una clase base, como en el ejemplo anterior, hay que convertir explícitamente la referencia de un tipo  a otro. Esto se hace con el operador de cast de la siguiente forma:

      //Instancia un ejecutivo en una variable de tipo Empleado
      Empleado emp = new Ejecutivo (“Máximo Dueño”, 2000);

      //Se convierte (o castea) la referencia de tipo
      Ejecutivo ej = (Ejecutivo) emp;

      //Usamos el método de la clase Ejecutivo
      ej.ejecutarPlanificacion();

La expresión de la segunda línea convierte la referencia de tipo Empleado asignándola a una referencia de tipo Ejecutivo. Para el compilador es correcto porque Ejecutivo es una clase derivada de Empleado. En tiempo de ejecución la JVM convertirá la referencia si efectivamente emp apunta a un objeto de la clase Ejecutivo, caso contrario lanzara una excepción.
Por el contrario, si intenta realizar lo siguiente:

      Empleado emp = new Empleado (“Mario Gómez”, 2000);
      Ejecutivo ej = (Ejecutivo) emp;

No dará problemas de compilación, pero al ejecutar se pero al ejecutar se producirá un error ya que la referencia emp apunta a un objeto de la clase Empleado y no a un objeto de clase Ejecutivo.

Herencia



Definición:


                La herencia se produce a partir de dos clases relacionadas, es decir una subclase que hereda los atributos y los métodos de la superclase. La jerarquía de clases, o árbol de herencia se lleva a cabo a partir de esta herencia entre objetos. Se puede entender como la relación “es un” entre dos clases. Si la subclase C2  hereda de la superclase C1, se dice que C2 “es un” C1.

Ejemplo:

La clase Hombre hereda de la clase persona, entonces podemos decir que Hombre “es una” Persona

En Java:                               


                               public class Hombre extends Persona{

                               }


Aclaracion: TODAS las clases en Java heredan de la clase Object.           


UML de Herencia                                                             

Constructores y Destructores


El constructor:
                              
Los constructores son métodos pertenecientes a la clase. Se utilizan para construir o instanciar una clase. Puede haber varios constructores, de acuerdo a las necesidades del usuario.

                                               public class Persona {
                                              
                                                               //Atributos
                                                               prívate int altura;
                                              
                                                               //Constructores
                                                               public Persona{
                                                               }

                                                               public Persona(int unaAltura){
                                                               this.altura = unaAltura; // ó setAltura(unaAltura);
                                                               }
                                               }

El destructor:

El destructor se utiliza para destruir una instancia de una clase y liberar memoria. En Java no hay destructores, ya que la liberación de memoria es llevada acabo por el Garbage Collector cuando las instancias de los objetos quedan desreferenciadas.
El método dispose() de cada objeto se llama previo a ser “recolectado”.