Programacrión orientada a objetos en Java
jueves, noviembre 1, 2001 at 1:00AM
Java y la Programación Orientada a Objetos
Introducción.
En este capitulo revisaremos de forma breve algunas características de Java en relación a la programación orientada a objetos. Como mencionamos anteriormente, Java es un lenguaje de programación relativamente joven, a pesar de ello, desde su aparición hasta nuestros días, su crecimiento ha sido vertiginoso, esto se debe en gran parte a la naturaleza misma del lenguaje que ha permitido a los creadores de Java añadir al lenguaje grupos de clases que pueden ser fácilmente adaptadas a las necesidades del desarrollador de software. A estos grupos de clases se les conoce comúnmente como APIs, y los hay para diferentes propósitos que van desde la implementación de una interfaz grafica para el usuario, como sería Swing Set, hasta la conectividad de bases de datos, como es el caso de JDBC (Java Data Base Conectivity). Sin embargo, para los propósitos del presente proyecto, nosotros nos limitaremos a revisar brevemente las características de Java como lenguaje orientado a objetos, es decir revisaremos la forma en que Java implementa las clases, los objetos, la herencia, etc.
Origen de Java.
El lenguaje de programación Java fue inventado por Sun Microsystems, empresa líder en servidores para Internet. En un momento de su historia, Sun decidió entrar al mercado de los electrodomésticos y desarrollar pequeños programas para los mismos, lo que resultó en la creación de la filial FirstPeterson Inc. Las televisiones interactivas, las microondas, son ejemplos del mercado que pretendía cubrir esta nueva empresa.
James Gosling, el miembro de este equipo con más experiencia en lenguajes de programación había notado la necesidad de desarrollar un lenguaje de programación que cubriera las necesidades que la empresa requería, tales como fiabilidad de código, robustez, y facilidad de desarrollo, para Gosling, las ventajas de C++ no justificaban los costos de pruebas y depuración requeridas por éste lenguaje.
En un intento por remediar las deficiencias que había notado en lenguajes como C y C++, Gosling decidió crear su propio lenguaje de programación llamado Oak, e introducirlo en la empresa. El primer proyecto en el que se aplicó este lenguaje fue un sistema completo de control de aparatos electrodomésticos en el hogar denominado Star Seven. Otros proyectos fueron realizados después de Star Seven, tales como sistemas de televisión interactiva, pero ninguno de trascendencia comercial para Sun, lo que obligó a FirstPeterson a cerrar sus puertas en 1994.
Bill Joy, uno de los desarrolladores principales del Unix de Berkeley y cofundador de Sun, vio en Oak el lenguaje de programación adecuado para conquistar el creciente campo del Internet. Después de algunos ajustes en el diseño y un cambio de nombre, se presenta públicamente en agosto de 1995 el lenguaje de programación Java.
Características de Java.
Pueden mencionarse muchas características de Java, sin embargo para los propósitos del presente proyecto mencionaremos sólo las más significativas para la implementación del mismo:
- Orientado a Objetos.
- Robusto.
- Independiente de plataforma.
- Multitarea.
Orientado a Objetos.
Java soporta las características esenciales del paradigma de la programación a objetos: encapsulación, herencia y polimorfismo. Java hace uso de la definición de entidades formadas por métodos y variables que reciben el nombre de clases, la instancia de alguna clase cualquiera en Java recibe el nombre de objeto.
Robusto.
Java elimina el uso de apuntadores para referenciar localidades de memoria, Java además libera al desarrollador de la necesidad de desalojar la memoria que la aplicación ya no usa, aunado a esto Java requiere la declaración explicita tanto de los tipos de datos como de métodos. Estos factores que acabamos de mencionar, destacan como causas comunes de errores lo que resulta en aplicaciones poco fiables. Al implementar una aplicación en Java se reduce el porcentaje de errores ocasionados por las causas antes mencionadas lo que da como consecuencia programas más robustos y confiables. Es importante mencionar que Java verifica que no haya problemas tanto en tiempo de ejecución como en tiempo de compilación. Finalmente Java hace uso de excepciones para notificar al usuario acerca de las fallas que puedan encontrarse en el sistema y recuperar dicho sistema.
Independiente de plataforma.
Mientras que en lenguajes de programación como C++ existe la necesidad de recompilar el código fuente cada vez que se cambia de plataforma, Java ofrece la posibilidad de que los archivos que son generados para una aplicación sean independientes de plataforma, es decir, que se compilen una vez y se ejecuten en cualquier plataforma. Esto es posible gracias a que las aplicaciones hechas en Java generan archivos conocidos como bytecode. Estos archivos no corresponden a algún procesador o sistema operativo en particular, digamos Intel o Motorola, Unix o Windows, sino que al momento de ser ejecutados un interprete propio de cada plataforma interpreta el bytecode al correspondiente sistema y procesador en el cual se esta ejecutando. Cada plataforma (Macintosh, Windows, Linux, etc) tiene su propio interprete de Java, pero el archivo bytecode es el mismo para todas las plataformas.
Multitarea.
A pesar de que las capacidades de multitarea que pueden ser implementadas en Java dependen en gran parte del sistema operativo en el cual se ejecuten, digamos Windows o Unix, dichas capacidades superan en gran manera a los entornos de flujo único (single-thread) que ofrecen otros lenguajes de programación. Al ser multitarea Java permite la ejecución concurrente de varios procesos ligeros o hilos de ejecución.
Clases en Java.
El elemento básico de la programación orientada a objetos en Java es la clase. Las clases en Java definen las entidades que conformarán la aplicación. Una clase es definida por medio de variables y métodos.
En Java todo elemento o es parte de una clase o bien es una clase o bien describe el funcionamiento de una clase.
Supongamos, únicamente para propósitos de ejemplo, que queremos implementar una aplicación que utiliza objetos puntos con componentes x y y que pueden desplazarse tales puntos con un radio constante de 10 unidades, para poder crear estos objetos, en Java definimos primero el molde Punto de donde posteriormente podemos instanciar los objetos requeridos. El siguiente código puede ser una solución a éste problema:
class Punto
{
int x;
int y;
static int radio = 10;
Punto (int a, int b)
{
x= a;
y= b;
}
void desplazarX(int t)
{
x= x + t;
}
void desplazarY (int h)
{
y = y + h;
}
}
Los atributos de la clase en este caso son: x y y. El comportamiento de esta clase se define en los métodos desplazarX, desplazarY. El seudo método Punto, recibe el nombre de constructor y es utilizado para inicializar valores de los atributos de una clase.
En Java, todas las clases son por omisión derivadas de una clase madre llamada Object. Las clases pueden ser de tipo: public, lo que significa que son accesibles desde otras clases; abstract, las cuales definen sus métodos pero no los implementan sino que son utilizadas para servir como clases madres a otras clases que se crean a partir de estas; final, las cuales ya no pueden ser clases madre para ninguna subclase; synchronizable, las clases de este tipo especifican que sus miembros (variables y métodos) no pueden ser accesados desde diferentes tareas al mismo tiempo, lo que evita que haya sobre escritura de datos.
Los miembros de una clase pueden ser definidos de dos formas, de instancia y de clase. Si una variable es definida como variable de instancia significa que cada vez que se instancie un objeto de dicha clase, el objeto puede contener cualquier valor para dicha variable. Retomando el ejemplo anterior, si creamos diferentes instancias de la clase punto, cada instancia puede tomar valores diferentes para sus variables x y y. En Java, por omisión todos los miembros de una clase son de instancia. Si es necesario que un componente del objeto no cambie sino que permanezca constante para todos los objetos del mismo tipo, es conveniente declararlo como un miembro de clase, en el ejemplo anterior vimos que todos los puntos creados tenían el radio constante, en este caso definimos la variable radio como variable de clase, en Java un miembro clase se define por medio de la palabra reservada static.
Objetos en Java.
Como hemos venido mencionando, en Java el componente principal para implementar la orientación a objetos es la clase, la clase es el molde o prototipo de donde se instancian los objetos. El objeto es entonces, un caso particular de la clase.
Revisemos nuevamente el ejemplo que hemos estado trabajando en este capitulo, supongamos que necesitamos instanciar dos objetos punto para una cierta aplicación, en Java esto puede hacerse de la siguiente manera:
. . .
Punto p0 = new Punto(5,10);
Punto p1 = new Punto(6,12);
. . .
En este caso los objetos p0 y p1 son instancias de la clase Punto, cada cual con valores diferentes en sus variables de instancia: x y y, con el mismo valor en su variable de clase: radio y con las mismas capacidades de comportamiento desplazarX y desplazarY.
Una vez que se ha creado un objeto, se pueden modificar sus miembros de la siguiente manera:
. . .
p1.desplazarX(15);
. . .
Este caso, modificamos el componente x del objeto p1 haciendo un llamado al método desplazarX con el valor 15, lo que da por resultado añadir 15 unidades al valor de la variable x, únicamente del punto p1.
La creación de un objeto en Java se realiza de acuerdo a los siguientes puntos:
- Declaración. Nombre del objeto.
- Instanciación. Asignación de memoria al objeto.
- Inicialización. Opcionalmente, asignar valores iniciales al objeto.
Herencia.
En Java una clase puede definirse como la extensión de una clase madre y a su vez esta clase puede servir como clase madre para que otras subclases deriven de ésta misma.
Veamos un ejemplo, supongamos que necesitamos definir objetos puntos muy semejantes a los que hemos definido en el ejemplo anterior pero que además tengan otras propiedades, digamos peso y color y que se desplacen las mismas unidades tanto en x como en y, tenemos dos opciones, una sería construir otra clase totalmente nueva que tenga una implementación muy similar a la de la clase Punto pero además agregue los nuevos miembros, opción que no es muy recomendable puesto que es trabajar sobre algo que ya hemos hecho, o bien crear una nueva clase partiendo de la clase Punto. El siguiente código nos muestra una forma de implementar esta nueva clase a la que llamaremos PuntoPC que derivará de la clase Punto.
class PuntoPC extends Punto
{
String color;
float peso;
PuntoPC(int a, int b, String c, float p)
{
super (a,b);
color = c;
peso = p;
}
void desplazarAmbos(int d)
{
x= x+d;
y= y+d;
}
}
En este caso, el único comentario adicional sería especificar que el constructor PuntoPC toma los valores iniciales a y b y los pasa a la súper clase Punto y asigna los valores peso y color a sus correspondientes variables.
En java no existe la herencia múltiple como tal, es decir una clase no puede tener mas de una clase madre, sin embargo los beneficios de la herencia múltiple pueden ser implementados mediante el uso de interfaces las que a continuación discutimos.
Interfaces.
De manera informal podemos definir a una interfaz como una clase en la que se declaran métodos y valores constantes, pero no se implementan sino que serán implementados por una clase que, valga la redundancia, implemente dicha interfaz.
Tanto las clases como las interfaces tienen prácticamente el mismo formato general, los siguientes puntos definen las diferencias que existen entre una clase y una interfaz.
- Una interfaz al igual que una clase abstracta, declara los métodos pero no los implementa.
- Una clase puede implementar varias interfaces, manteniendo la estructura del lenguaje simple y al mismo tiempo, proveyendo las ventajas de la herencia múltiple.
- No se pueden instanciar objetos a partir de una interfaz.
- Todos los métodos de una interfaz son de forma implícita públicos y abstractos.
- Todas las variables de una interfaz son de forma implícita públicas, estáticas y finales.
- Cuando una clase implementa una interfaz, debe implementar todos y cada uno de sus métodos, siempre y cuando, la clase no sea abstracta.
- Una interfaz no tiene una clase padre antecesora (como en el caso de las clases que por omisión tienen a la clase Objet), en vez de eso, las clases tienen una jerarquía independiente que puede ser aplicada a cualquier nivel del árbol de clases.
Resumen.
La precedente discusión no pretende ser de forma alguna un estudio exhaustivo de Java en el contexto de la orientación a objetos, sino simplemente, es una revisión a groso modo de la forma en que el lenguaje de programación Java lidia con los conceptos de objetos, herencia, clases, etc. fundamentales para la comprensión y el desarrollo del presente proyecto.
Así pues, la clase es el concepto fundamental de Java para implementar el paradigma de la tecnología orientada a objetos, por medio de la clase, Java logra modularidad, polimorfismo, herencia y encapsulamiento, determinantes en la concepción de un lenguaje orientado a objetos.
Bibliografía
Agustín Froufe, Java 2 Manual de Usuario y tutorial, Alfaomega, 2000.
Steven W. Griffith. 1001 tips para programar con Java. McGraw-Hill. 1997.
Mary Campione, et al, The Java Tutorial, A short course on the basics. Addison-Wesley. 2000.
Bruce Eckel, Thinking in Java. Prentice Hall. 2000.
Wood, J., Java Programming for Spatial Science, http://www.geog.le.ac.uk/jwo/teaching/javaProg, 1999.
|
j2se 
Reader Comments