Looking for java Keywords? Try Ask4Keywords

Java LanguageC ++ - Vergleich


Einführung

Java und C ++ sind ähnliche Sprachen. Dieses Thema dient als Kurzanleitung für Java- und C ++ - Engineer.

Bemerkungen

In anderen Konstrukten definierte Klassen #

Innerhalb einer anderen Klasse definiert

C ++

Geschachtelte Klasse [ref] (benötigt eine Referenz zum Einschließen der Klasse)

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

      private:
         Outer*  outer;
   };
};

Java

[nicht statisch] Geschachtelte Klasse (auch bekannt als Inner Class oder Member Class)

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

Statisch innerhalb einer anderen Klasse definiert

C ++

Statische verschachtelte Klasse

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

Java

Statische verschachtelte Klasse (auch bekannt als statische Member-Klasse) [ref]

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

Innerhalb einer Methode definiert

(zB Eventhandling)

C ++

Lokale Klasse [ref]

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

Siehe auch Lambda-Ausdrücke

Java

Lokale Klasse [ref]

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

Überschreiben vs Überladen

Die folgenden Overriding- und Overloading-Punkte gelten sowohl für C ++ als auch für Java:

  • Eine überschriebene Methode hat denselben Namen und dieselben Argumente wie ihre Basismethode.
  • Eine überladene Methode hat denselben Namen, jedoch unterschiedliche Argumente und ist nicht auf die Vererbung angewiesen.
  • Zwei Methoden mit demselben Namen und Argumenten, aber unterschiedlichen Rückgabetypen sind ungültig. Siehe verwandte Stackoverflow-Fragen zum Thema "Überladen mit anderem Rückgabetyp in Java" - Frage 1 ; Frage 2

Polymorphismus

Polymorphismus ist die Fähigkeit von Objekten verschiedener Klassen, die durch Vererbung miteinander in Beziehung stehen, auf denselben Methodenaufruf unterschiedlich zu reagieren. Hier ist ein Beispiel:

  • Basisklasse Form mit Fläche als abstrakte Methode
  • Zwei abgeleitete Klassen, Square und Circle, implementieren Flächenmethoden
  • Formbezugspunkte auf Quadrat und Fläche werden aufgerufen

In C ++ wird Polymorphismus durch virtuelle Methoden aktiviert. In Java sind die Methoden standardmäßig virtuell.

Reihenfolge der Konstruktion / Zerstörung

Reihenfolge der Konstruktion / Zerstörung

Objektbereinigung

In C ++ empfiehlt es sich, einen Destruktor als virtuell zu deklarieren, um sicherzustellen, dass der Destruktor der Unterklasse aufgerufen wird, wenn der Basisklassenzeiger gelöscht wird.

In Java ist eine Finalize-Methode ein Destruktor in C ++. Finalizer sind jedoch unvorhersehbar (sie sind auf GC angewiesen). Bewährte Methode: Verwenden Sie eine "close" -Methode, um explizit zu bereinigen.

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

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

Abstrakte Methoden und Klassen

Konzept C ++ Java
Abstrakte Methode
ohne Implementierung deklariert
reine virtuelle Methode
virtual void eat(void) = 0;
abstrakte Methode
abstract void draw();
Abstrakte Klasse
kann nicht instanziiert werden
kann nicht instanziiert werden; hat mindestens 1 reine virtuelle Methode
class AB {public: virtual void f() = 0;};
kann nicht instanziiert werden; kann nicht abstrakte Methoden haben
abstract class GraphicObject {}
Schnittstelle
keine Instanzfelder
Kein "interface" - Schlüsselwort, kann jedoch eine Java-Schnittstelle mit Einrichtungen einer abstrakten Klasse nachahmen sehr ähnlich der abstrakten Klasse, aber 1) unterstützt Mehrfachvererbung; 2) keine Instanzfelder
interface TestInterface {}

Eingabehilfen-Modifikatoren

Modifikator C ++ Java
Öffentlich - für alle zugänglich keine besonderen Hinweise keine besonderen Hinweise
Geschützt - durch Unterklassen zugänglich auch für Freunde zugänglich auch innerhalb desselben Pakets zugänglich
Privat - für Mitglieder zugänglich auch für Freunde zugänglich keine besonderen Hinweise
Standard Klassenstandard ist privat; struct default ist public zugänglich für alle Klassen innerhalb desselben Pakets
andere Freund - eine Möglichkeit, privaten und geschützten Mitgliedern Zugriff ohne Erbschaft zu gewähren (siehe unten)

C ++ Freund Beispiel

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

Das gefürchtete Diamantproblem

Das Raute-Problem ist eine Mehrdeutigkeit, die entsteht, wenn zwei Klassen B und C von A erben und Klasse D sowohl von B als auch C erbt. Wenn es eine Methode in A gibt, die B und C überschrieben haben, überschreibt D sie nicht Welche Version der Methode erbt D: die von B oder die von C? (aus Wikipedia )

Das gefürchtete Diamantproblem

Während C ++ für Diamantenprobleme immer anfällig war, war Java bis Java 8 anfällig. Ursprünglich unterstützte Java keine Mehrfachvererbung, aber mit dem Aufkommen von Standardschnittstellenmethoden können Java-Klassen die "Implementierung" nicht von mehreren Klassen erben .

java.lang.Object-Klasse

In Java erben alle Klassen implizit oder explizit von der Object-Klasse. Jede Java-Referenz kann in den Objekttyp umgewandelt werden.

C ++ hat keine vergleichbare "Object" -Klasse.

Java-Sammlungen und C ++ - Container

Java Collections sind mit C ++ Containern identisch.

Flussdiagramm für Java-Sammlungen

C ++ Container-Flussdiagramm

Integer-Typen

Bits Mindest Max C ++ - Typ
(auf LLP64 oder LP64)
Java-Typ
8 -2 (8-1) = -128 2 (8-1) -1 = 127 verkohlen Byte
8 0 2 (8) -1 = 255 unsigniertes Zeichen -
16 -2 (16-1) = -32,768 2 (16-1) -1 = 32.767 kurz kurz
16 0 (\ u0000) 2 (16) -1 = 65.535 (\ uFFFF) unsigniert kurz char (unsigniert)
32 -2 (32-1) = -2,147 Milliarden 2 (32-1) -1 = 2,147 Milliarden int int
32 0 2 (32) -1 = 4,295 Milliarden unsigned int -
64 -2 (64-1) 2 (16-1) -1 lange* lang Lang
64 0 2 (16) -1 unsigniert lang
unsigniert lange
-

* Win64-API ist nur 32 Bit

Viele weitere C ++ - Typen

C ++ - Vergleich Verwandte Beispiele