Java LanguageComparación de C ++


Introducción

Java y C ++ son lenguajes similares. Este tema sirve como una guía de referencia rápida para los ingenieros de Java y C ++.

Observaciones

Clases definidas dentro de otras construcciones #

Definido dentro de otra clase

C ++

Clase anidada [ref] (necesita una referencia para encerrar clase)

class Outer {
   class Inner {
      public:
         Inner(Outer* o) :outer(o) {}

      private:
         Outer*  outer;
   };
};

Java

Clase anidada [no estática] (clase interna o clase miembro)

class OuterClass {
    ...
    class InnerClass {
        ...
    }
}

Definido estáticamente dentro de otra clase

C ++

Clase anidada estática

class Outer {
   class Inner {
      ...
   };
};

Java

Clase anidada estática (también conocida como clase de miembro estática) [ref]

class OuterClass {
    ...
    static class StaticNestedClass {
        ...
    }
}

Definido dentro de un método

(por ejemplo, manejo de eventos)

C ++

Clase local [ref]

void fun() {
   class Test {
      /* members of Test class */
   };
}

Ver también expresiones Lambda.

Java

Clase local [ref]

class Test {
    void f() {
        new Thread(new Runnable() {
            public void run() {
                doSomethingBackgroundish();
            }
        }).start();
    }
}

Anulando vs Sobrecarga

Los siguientes puntos de Anulación frente a Sobrecarga se aplican tanto a C ++ como a Java:

  • Un método anulado tiene el mismo nombre y argumentos que su método base.
  • Un método sobrecargado tiene el mismo nombre pero diferentes argumentos y no se basa en la herencia.
  • Dos métodos con el mismo nombre y argumentos pero diferente tipo de devolución son ilegales. Consulte las preguntas relacionadas sobre Stackoverflow sobre "sobrecarga con diferentes tipos de retorno en Java" - Pregunta 1 ; Pregunta 2

Polimorfismo

El polimorfismo es la capacidad de los objetos de diferentes clases relacionadas por herencia para responder de manera diferente a la misma llamada de método. Aquí hay un ejemplo:

  • Clase base Forma con área como método abstracto
  • Dos clases derivadas, Cuadrado y Círculo, implementan métodos de área.
  • Forma los puntos de referencia a Plaza y área se invoca.

En C ++, el polimorfismo es habilitado por métodos virtuales. En Java, los métodos son virtuales por defecto.

Orden de Construcción / Destrucción

Orden de Construcción / Destrucción

Limpieza de objetos

En C ++, es una buena idea declarar un destructor como virtual para garantizar que se llamará al destructor de la subclase si se elimina el puntero de la clase base.

En Java, un método de finalización es similar a un destructor en C ++; sin embargo, los finalizadores son impredecibles (dependen de GC). Práctica recomendada: utilice un método "cerrado" para la limpieza explícita.

protected void close() {
    try {
       // do subclass cleanup
    }
    finally {
       isClosed = true;
       super.close();
    }
}

protected void finalize() {
    try {
       if(!isClosed) close();
    }
    finally {
       super.finalize();
    }
}

Métodos y clases abstractas

Concepto C ++ Java
Método abstracto
declarado sin implementación
método virtual puro
virtual void eat(void) = 0;
método abstracto
abstract void draw();
Clase abstracta
no puede ser instanciado
no puede ser instanciado; tiene al menos 1 método virtual puro
class AB {public: virtual void f() = 0;};
no puede ser instanciado; puede tener métodos no abstractos
abstract class GraphicObject {}
Interfaz
campos sin instancia
ninguna palabra clave de "interfaz", pero puede imitar una interfaz de Java con instalaciones de una clase abstracta muy similar a la clase abstracta, pero 1) admite herencia múltiple; 2) campos sin instancia
interface TestInterface {}

Modificadores de accesibilidad

Modificador C ++ Java
Público - accesible por todos sin notas especiales sin notas especiales
Protegido - accesible por subclases también accesible por amigos También accesible dentro del mismo paquete
Privado - accesible por los miembros también accesible por amigos sin notas especiales
defecto la clase por defecto es privada; La estructura por defecto es pública Accesible por todas las clases dentro del mismo paquete.
otro Amigo: una forma de otorgar acceso a miembros privados y protegidos sin herencia (ver más abajo)

Ejemplo de C ++ Friend

class Node {
  private:
    int key;  Node *next;
    // LinkedList::search() can access "key" & "next"
    friend int LinkedList::search();
};

El temido problema del diamante

El problema del diamante es una ambigüedad que surge cuando dos clases B y C heredan de A, y la clase D hereda de B y C. Si hay un método en A que B y C se han invalidado, y D no lo reemplaza, entonces ¿Qué versión del método hereda D: la de B o la de C? (de Wikipedia )

El temido problema del diamante

Si bien C ++ siempre ha sido susceptible al problema diamante, Java fue susceptible hasta Java 8. Originalmente, Java no admitía herencia múltiple, pero con la llegada de los métodos de interfaz predeterminados, las clases Java no pueden heredar la "implementación" de más de una clase. .

clase java.lang.Object

En Java, todas las clases heredan, ya sea implícita o explícitamente, de la clase Object. Cualquier referencia de Java se puede convertir al tipo de objeto.

C ++ no tiene una clase de "Objeto" comparable.

Colecciones Java y Contenedores C ++

Las colecciones de Java son sinónimas con los contenedores de C ++.

Diagrama de flujo de colecciones Java

Diagrama de flujo de contenedores C ++

Tipos enteros

Bits Min Max Tipo C ++
(en LLP64 o LP64)
Tipo de Java
8 -2 (8-1) = -128 2 (8-1) -1 = 127 carbonizarse byte
8 0 2 (8) -1 = 255 sin firmar -
dieciséis -2 (16-1) = -32,768 2 (16-1) -1 = 32,767 corto corto
dieciséis 0 (\ u0000) 2 (16) -1 = 65,535 (\ uFFFF) corto sin firmar char (sin firmar)
32 -2 (32-1) = -2.147 mil millones 2 (32-1) -1 = 2.147 millones En t En t
32 0 2 (32) -1 = 4.295 mil millones sin firmar int -
64 -2 (64-1) 2 (16-1) -1 largo* largo largo
64 0 2 (16) -1 sin firmar largo *
sin firmar mucho tiempo
-

* Win64 API es solo de 32 bits

Muchos más tipos de C ++

Comparación de C ++ Ejemplos relacionados