¿Cuáles son las principales dificultades que enfrentan las personas cuando aprenden Java con un fondo de C ++?

  1. Los programadores experimentados de C ++ están muy acostumbrados a usar RAII (la adquisición de recursos es la inicialización). Java no tiene RAII, por lo que tiene que hacer la administración de recursos de alguna otra manera, probablemente usando try-with-resources.
  2. C ++ tiene plantillas, que son muy versátiles y se pueden usar para la metaprogramación de plantillas. Los argumentos de la plantilla de C ++ pueden ser tipos, o pueden ser valores constantes. Java no tiene plantillas; Tiene genéricos, que no son nada como plantillas. Los argumentos de tipo genérico tienen que ser de un tipo de objeto (los tipos primitivos deben estar encuadrados primero), y en particular, no se pueden usar los valores como un argumento genérico.

    Peor aún, los genéricos de Java se basan en el borrado, lo que significa que los argumentos de tipo no están disponibles en tiempo de ejecución. Así, por ejemplo, HashSet y HashSet se consideran la misma clase en tiempo de ejecución.

  3. C ++ tiene herencia múltiple, que se puede usar para implementar mixins. Java solo tiene una herencia, y no admite mixins. Java 8 tiene métodos predeterminados, también conocidos como métodos de extensión, que se pueden usar para simular algunos tipos de mixins, pero tienen limitaciones.

    En una nota relacionada, C ++ tiene herencia privada, que se puede usar para relaciones has-a (“composición”). Java solo tiene herencia pública, por lo que solo debe usar subclases para las relaciones is-a. Por lo tanto, las clases como AbstractList y AbstractCollection son técnicamente una violación del principio de sustitución de Liskov, ya que realmente están destinadas a ser clases mixtas, si Java tenía mixins.

  4. C ++ admite referencias de valores (“paso por referencia”). Java no lo hace, y todo es pasado por valor (las “referencias” de Java se parecen más a los punteros, excepto que no se puede hacer aritmética de punteros con ellos, y las matrices son sus propios tipos que no “decaen a los punteros”) . Tienes que crear una clase de boxeo si quieres simular el paso por referencia.
  5. C ++ tiene const. Java no lo hace. Si desea simular const en Java, generalmente debe crear una interfaz de solo lectura que no contenga métodos de mutación y que su clase la implemente.
  6. Java tiene su propio modelo de concurrencia, que usted querrá estudiar con cierto cuidado. Considero que Java Concurrency in Practice es un gran libro para esto.

Estoy seguro que recordaré más puntos para agregar más adelante. 🙂

Aprender Java una vez que sepas que C ++ es bastante fácil. Hay diferencias, pero no tan difíciles de entender.

Lo que realmente me costó pasar de C ++ a Java fue el ecosistema de Java: archivos de manifiesto xml, archivos jar y demás. Muy diferente del modelo clásico de compilación / enlace de C ++.