Java es
un lenguaje originalmente desarrollado por un grupo de ingenieros de Sun,
utilizado por Netscape posteriormente como base para Javascript. Si bien su uso
se destaca en el Web, sirve para crear todo tipo de aplicaciones (locales,
intranet o internet).
Java es
un lenguaje:
De objetos
Independiente de la plataforma
Algunas características notables:
- Robusto
- Gestiona la memoria automáticamente
- No
permite el uso de técnicas de programación inadecuadas
- Multithreading
- Cliente-servidor
- Mecanismos
de seguridad incorporados
- Herramientas
de documentación incorporadas
Lenguaje de Objetos
Por qué
puse "de" objetos y no "orientado a" objetos? Para destacar
que, al contrario de otros lenguajes como C++, no es un lenguaje modificado
para poder trabajar con objetos sino que es un lenguaje creado para trabajar
con objetos desde cero. De hecho, todo lo que hay en Java son objetos.
¿Qué es un objeto?
Bueno, se
puede decir que todo puede verse como un objeto. Pero seamos más claros. Un
objeto, desde nuestro punto de vista, puede verse como una pieza de software
que cumple con ciertas características:
Encapsulamiento
significa que el objeto es auto-contenido, o sea que la misma definición del
objeto incluye tanto los datos que éste usa (atributos) como los procedimientos
(métodos) que actúan sobre los mismos. Cuando se utiliza programación orientada
a objetos, se definen clases (que definen objetos genéricos) y la forma en que
los objetos interactúan entre ellos, a través de mensajes. Al crear un objeto
de una clase dada, se dice que se crea una instancia de la clase, o un objeto
propiamente dicho. Por ejemplo, una clase podría ser "autos", y un
auto dado es una instancia de la clase.
La
ventaja de esto es que como no hay programas que actúen modificando al objeto,
éste se mantiene en cierto modo independiente del resto de la aplicación. Si es
necesario modificar el objeto (por ejemplo, para darle más capacidades), esto
se puede hacer sin tocar el resto de la aplicación… lo que ahorra mucho tiempo,
inclusive, ni siquiera existen las variables globales! (Aunque parezca difícil
de aceptar, esto es una gran ventaja desde el punto de vista del desarrollo).
En cuanto
a la herencia, simplemente significa que se pueden crear nuevas clases que
hereden de otras preexistentes; esto simplifica la programación, porque las
clases hijas incorporan automáticamente los métodos de las madres. Por ejemplo,
nuestra clase "auto" podría heredar de otra más general,
"vehículo", y simplemente redefinir los métodos para el caso
particular de los automóviles… lo que significa que, con una buena biblioteca
de clases, se puede reutilizar mucho código inclusive sin saber lo que tiene
adentro.
Un ejemplo simple para ir teniendo una idea, vamos a poner un ejemplo
de una clase Java:
public class Muestra extends Frame {
//
atributos de la clase
Button
si;
Button no;
//
métodos de la clase:
public Muestra () {
Label comentario = new Label("Presione un
botón", Label.CENTER);
si = new
Button("Sí");
no = new
Button("No");
add("North",
comentario);
add("East", si);
add("West",
no); } }
Esta
clase no está muy completa así, pero da una idea… Es una clase heredera de la
clase Frame (un tipo de ventana) que tiene un par de botones y un texto. Contiene
dos atributos ("si" y "no"), que son dos objetos del tipo
Button, y un único método llamado Muestra (igual que la clase, por lo que es lo
que se llama un constructor).
Independiente de la plataforma
Esto es casi del todo cierto… En realidad,
Java podría hacerse correr hasta sobre una Commodore 64! La realidad es que
para utilizarlo en todo su potencial, requiere un sistema operativo
multithreading (como Unix, Windows95, OS/2…).
¿Cómo es esto?
Porque en
realidad Java es un lenguaje interpretado… al menos en principio. Al compilar
un programa Java, lo que se genera es un seudocódigo definido por Sun, para una
máquina genérica. Luego, al correr sobre una máquina dada, el software de
ejecución Java simplemente interpreta las instrucciones, emulando a dicha máquina
genérica. Por supuesto esto no es muy eficiente, por lo que tanto Netscape como
Hotjava o Explorer, al ejecutar el código por primera vez, lo van compilando
(mediante un JIT: Just In Time compiler), de modo que al crear por ejemplo la
segunda instancia de un objeto el código ya esté compilado específicamente para
la máquina huésped. Además, Sun e Intel se han puesto de acuerdo para
desarrollar procesadores que trabajen directamente en Java, con lo que planean
hacer máquinas muy baratas que puedan conectarse a la red y ejecutar
aplicaciones Java cliente-servidor a muy bajo costo. El lenguaje de dicha
máquina genérica es público, y si uno quisiera hacer un intérprete Java para
una Commodore sólo tendría que implementarlo y pedirle a Sun la aprobación (para
que verifique que cumple con los requisitos de Java en cuanto a cómo interpreta
cada instrucción, la seguridad, entre otros.)
Algunas características
Entre las
características que nombramos nos referimos a la robustez. Justamente por la
forma en que está diseñado, Java no permite el manejo directo del hardware ni
de la memoria (inclusive no permite modificar valores de punteros, por
ejemplo); de modo que se puede decir que es virtualmente imposible colgar un
programa Java. El intérprete siempre tiene el control. Inclusive el compilador
es suficientemente inteligente como para no permitir un montón de cosas que
podrían traer problemas, como usar variables sin inicializarlas, modificar
valores de punteros directamente, acceder a métodos o variables en forma
incorrecta, utilizar herencia múltiple, entre otros. Además, Java implementa mecanismos
de seguridad que limitan el acceso a recursos de las máquinas donde se ejecuta,
especialmente en el caso de los Applets (que son aplicaciones que se cargan
desde un servidor y se ejecutan en el cliente). También está diseñado
específicamente para trabajar sobre una red, de modo que incorpora objetos que
permiten acceder a archivos en forma remota (via URL por ejemplo). Además, con
el JDK (Java Development Kit) vienen incorporadas muchas herramientas, entre
ellas un generador automático de documentación que, con un poco de atención al
poner los comentarios en las clases, crea inclusive toda la documentación de
las mismas en formato HTML.