Java se creó a partir de C++ tratando de superar ciertos aspectos negativos para los objetivos del nuevo lenguaje. Como seguramente muchos lectores de este libro provienen del entorno C/C++ vale la pena realizar una rápida revisión de las cosas que en Java se hacen de otra manera que en C/C++.
Tipos de datos
Java no implementa tres tipos de datos soportados por C/C++: punteros, uniones y estructuras.
Punteros
Parece casi una falta de respeto al programador C/C++, que considera que el sabio uso de los punteros es lo que define a un programador experto. Pues bien, los desarrolladores del lenguaje Java consideraron que el uso de punteros es un arma de doble filo y un riesgo potencial evitable. Los punteros permiten el acceso directo a posiciones de memoria y ésta es una capacidad tan poderosa como peligrosa. Se debe tener en cuenta que un fallo en el uso de los punteros puede ser sin intención de hacer daño, pero también existen personas con malas intenciones. La decisión de Sun fue algo así como "muerto el perro se acabó la rabia".
Obviamente la funcionalidad que otorga el uso de los punteros es necesaria y Java la suple parcialmente con el pase de datos por referencias obteniendo así un mecanismo seguro y menos propenso a los errores humanos.
Uniones y estructuras
Las clases en Java suministran todas las funcionalidades de las uniones y estructuras, omitidas en la implementación de Java, con la ventaja de hacerlo de un modo más claro y aprovechando los conceptos de la programación orientada a objetos.
Operadores
Java decidió dar soporte a casi todos los operadores del lenguaje C, manteniendo también el orden de precedencia entre ellos. No obstante existen algunos añadidos y algunas desapariciones.
Java presenta varios operadores nuevos:
- + Concatenación de cadenas. No debe confundirse con el operador + aritmético que también sigue existiendo pero que representa otro operador totalmente diferente (a pesar de compartir el mismo símbolo).
- >>> Desplazamiento de caracteres hacia la derecha con extensión de signo.
- & y | Java trata a los datos booleanos como True y False, no como C que los trata como valores enteros. Ante esta diferencia, Java implementa estos dos operadores (OR y AND) para el tratamiento de datos booleanos, actuando del modo habitual para C cuando se encuentra con valores enteros.
- InstanceOf Se utiliza para determinar si un objeto fue creado a partir de una clase específica.
Java hace desaparecer algunos operadores:
- & Dereferencia. Java no trabaja con punteros por lo tanto este operador es innecesario.
- * Referencia. Idem anterior.
Argumentos en la línea de comandos
El lenguaje C nos permite pasar argumentos por la línea de comandos al ejecutar un programa y esto lo realiza mediante el uso de dos variables de argumento que le pasa el sistema operativo: argc (indica la cantidad de argumentos que se incluyen en la línea de comandos) y argv (un puntero a una matriz de cadenas que contiene los argumentos). Por su parte, el lenguaje Java gestiona los argumentos de un modo más sencillo, simplemente le pasa al programa una matriz de argumentos y si queremos averiguar cuántos argumentos hay en la matriz utilizamos el método length (del objeto args) y lo sabremos.
Cadenas
¿Qué pueden ser las cadenas sino simples secuencias de caracteres terminadas con un carácter nulo? Pues bien, en Java las cadenas son objetos y para ello se han definido dos clases.
El tratamiento de las cadenas como objetos presenta grandes ventajas respecto al modo tradicional: es bien sabido que la gestión de cadenas en C/C++ es un tema que no es trivial. En primer término, al programador se le ha simplificado su trabajo con una serie de métodos incorporados a las clases String y StringBuffer, y en segundo término, las cadenas se tratan de modo consistente en todos los sistemas y sin problemas de localización.
Comentarios
Los comentarios es texto que se añade al código del programa para describir lo que se está haciendo y que el intérprete o el compilador no toma en cuenta.
Java soporta los dos estilos de comentarios de C/C++ además de implementar un nuevo modo de comentario. Veamos los tres tipos de comentarios que se pueden utilizar:
cant = 1; /* comentario estilo C */ cant = 1; // comentario estilo C++, para una línea de texto cant = 1; /** comentario estilo Java para varias líneas de text */
Tal como se puede observar el comentario estilo C y el estilo Java no presenta grandes diferencias. Sin embargo, el comentario estilo Java además de servir como comentario se puede utilizar para la generación automática de documentación. Por ese motivo, a este estilo de comentario también se lo conoce con el nombre de comentario Doc y normalmente lo encontraremos al inicio de una definición de una clase o de un método para generar la documentación de la clase.
/** * Definición de la clase Empleado * fecha 20/04/2006 * @version 1.1.4 * @Autor ED */ class Empleado{ ... }
Una de las herramientas que genera la documentación se denomina javadoc y esta utiliza las etiquetas de documento (@…) para ampliar la documentación automática.
Otras diferencias entre Java y C/C++
Ya hemos analizado las diferencias más evidentes e importantes entre estos lenguajes. No obstante hay otros detalles para señalar:
- Java no implementa la instrucción goto, aunque la mantenga como palabra reservada.
- Java no implementa los mecanismos de preprocesamiento #define e #include.
- Java no implementa los tipos enumerados.
- Los tipos de datos booleanos de Java no se pueden convertir a valores enteros.