La sintaxis de Java resulta muy familiar a los programadores de C++, debido mayoritariamente a que Java proviene de C++. Sin embargo Java pretende mejorar a C++ en muchos aspectos (sobre todo en los aspectos orientados a objeto del lenguaje), aunque prohibe muchas de las tareas por las que C++ fue tan extendido.
Se observa que las diferencias han sido diseñadas como mejoras del lenguaje, ya que uno de los aspectos más criticado (y defendido) de C++ es su capacidad para hacer cosas "no orientadas a objetos", así como acceder a los recursos de las máquinas (lo que le permitía atacar sistemas, siendo uno de los lenguajes más difundidos entre los programadores de virus).
En este apéndice pretendemos mostrar aquellas diferencias significativas, para que los programadores familiarizados con C++ puedan programar en Java, conociendo sus posibilidades y limitaciones.
B. Diferencias sintáticas a.) Elementos similaresUso de bibliotecas (paquetes): Como no existen macros como #include, se utiliza import.
Operador de herencia: La herencia en Java se especifica con la palabra clave extends, en lugar del operador :: de C++.
Constantes: En lugar de const de C++ las variables constantes se declaran como static final.
b.) Elementos equivalentesMiembros estáticos: No es necesaria declaración previa (fuera de las clases) de los miembros estáticos (static).
Métodos inline: En Java no existen (hay que incluir el cuerpo de los métodos junto a su definición), aunque los compiladores Java suelen intentar expandir en línea (a modo de los métodos inline) los métodos declarados como final.
Métodos virtuales: Todos los métodos no estáticos (static) se consideran virtual en Java.
Forward: No existe en Java. Simplemente se llama el método, y el compilador se encarga de buscarlo.
Clases anidadas: Aunque Java no permite anidar clases, sí que se puede modelizar este concepto mediante los paquetes Java y la composición.
No existen "amigos" (friend): Es su lugar se considera amigas a todas las clases y elementos que componen un paquete.
c.) Elementos añadidosComentarios: Java soporta los dos tipos de comentarios de C++, e incorpora un tercero, con la sintaxis /** comentario */, para la documentación automática.
Operador >>> : Java añade este operador para desplazamientos a la derecha con signo.
Iniciación: Todos las variables de tipo simple y las referencias a objeto se inician a un valor 0 (o equivalente), y null para las referencias a objeto.
Referencia super: En Java super hace referencia a la superclase (clase padre) de la clase actual. Dicha clase sólo puede ser una, porque Java solo soporta herencia simple.
d.) Elementos suprimidosgoto: No existe en Java, aunque con break y continue, combinados con etiquetas de bloque, se puede suplir.
Condiciones: Deben utilizarse expresiones booleanas y nunca números.
Argumentos por defecto: Java no los soporta.
C. Diferencias de diseño a.) Tipos de datosTipos simples: Soporta los mismos que C++, añadiendo boolean (true/false), y ampliando el tipo char, para soportar caracteres Unicode de 16 bits.
Punteros: En Java no hay punteros, permitiendo así programación segura. En su lugar se crean las referencias a objeto, que pueden ser reasignadas (como si fueran un puntero a objeto de C++).
Vectores: Son objetos de sólo lectura, con un método length() para averiguar su longitud, y que lanzan una excepción si se intenta acceder a un elemento fuera del vector.
Clases: Todo debe de estar incluído en clases; no existen enumeraciones (enum) ni registros (struct).
Elementos globales: No existen variables o funciones globales, aunque se puede utilizar static para simularlas.
b.) Diseño de las clasesCuerpo de los métodos: Todos los cuerpos de las clases han de estar codificados en las definiciones de las clases. No se pueden separa como se hace en C++ mediante ficheros de cabecera (".h").
Constructores: Aunque existen constructores, como en C++, no existen constructores copia, puesto que los argumentos son pasados por referencia.
Destructores: No existen destructores en Java, ya que tiene recolección automática de basura, aunque en su lugar se pueden escribir métodos finalize(), que serán ejecutados cuando el recolector de basura de Java destruya el objeto.
Árbol de herencia: En Java todas las clases se relacionan en un único árbol de herencia, en cuya cúspide se encuentra la clase Object, con lo que todas las clases heredan de ella. En C++ sin embargo se pueden declarar clases que no tengan padre.
Herencia no restrictiva: Al heredar, no se puede reducir las ocultaciones del padre: En C++ sí se podría ampliar la visibilidad de uno de los elementos heredados. En todo caso sí se puede restringir.
Herencia simple de clases: No existe la herencia múltiple de clases. Aún así se puede implementar una herencia múltiple utilizando interfaces, dado que ellas sí la soportan.
Sobrecarga de métodos: Es exactamente igual que la de C++.
Sobrecarga de operadores: No existe. En los objetos String el operador + y += se permiten para la comparación de cadenas.
c.) Nuevos diseñosPlantillas (templates): En Java no se soportan plantillas p clases genéricas de C++, aunque existen una serie de clases en la API de Java que tratan objetos genéricos (clase Object) como Vector o Stack.
Interfaces (interface): Que son unas especies de clases abstractas con métodos abstractos, y que permiten herencia múltiple, utilizando la palabra reservada implements.
Diferente gestión de excepciones: Todas las excepciones de Java heredan de la clase Throwable, que las dota de una interfaz común.
D. Diferencias de ejecución a.) Aspectos modificados:Cadenas: Las cadenas entrecomilladas se convierten en objetos String, no en vectores estáticos de caracteres.
Instanciación: Los objetos se crean en el montículo (new) y nunca en la pila (malloc), y los tipos simples no permiten new (excepto los vectores de tipos simples, iguales que los de C++).
Intérprete: Los intérpretes Java son unas 20 veces más lentos que los de C, aunque esta diferencia se está reduciendo con lo compiladores JIT(Just In Time) para Java que están apareciendo en el mercado.
Bibliotecas estándar: En C++ existía casi una biblioteca por plataforma (si existía) para hacer cosas como: Trabajo en red, conexión a bases de datos, uso de múltiples hilos de control, uso de objetos distribuídos o compresión. Java incorpora bibliotecas estándar multiplataforma para todas estas tareas en su API.
Excepciones por fallos de descriptores: Java lanza excepciones cuando hay errores en el acceso a un descriptor, permitiendo al programador gestionar dichos fallos, y recuperar al programa de ellos.
Gestión de errores al compilar: Además comprobar el lanzamiento de excepciones en tiempo de compilación, comprueba el cumplimiento del lanzamiento de excepciones por los métodos sobreescritos.
b.) Aspectos eliminados:Preprocesador: Java no tiene preprocesador, por lo que las macros (#include, #define,...) no existen.
Acceso directo al hardware: En Java está restringido, aunque para eso permite la utilización de métodos nativos, escritos para la plataforma (normalmente C/C++). En cualquier caso las applets no pueden utilizar estos métodos nativos, sólo las aplicaciones Java pueden hacerlo.
c.) Aspectos introducidosMultiples hilos de control (multithreating): Java permite la utilización de múltiples hilos de control y la ejecución en paralelo (y sincronizada) de múltiples tareas, mediante la clase Thread.
Applets Java: Este tipo de aplicaciones son seguras, distribuíbles por Internet y ejecutables por los navegadores, aunque tienen restricciones (como la escritura en disco).
Extracción automática de documentación: Un nuevo tipo de comentario (/**com_doc*/) permite a los programadores extraer de manera automática comentarios de sus fuentes, generando automáticamente documentación estandarizada.
JavaBeans: Mediante esta biblioteca se permite crear elementos visuales multiplataforma, algo impensable en C++.