Recherche…


Introduction

Java et C ++ sont des langages similaires. Cette rubrique sert de guide de référence rapide pour les ingénieurs Java et C ++.

Remarques

Classes définies dans d'autres constructions #

Défini dans une autre classe

C ++

Classe imbriquée [ref] (nécessite une référence à la classe englobante)

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

      private:
         Outer*  outer;
   };
};

Java

[non statique] classe imbriquée (alias classe interne ou classe de membre)

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

Définie statiquement dans une autre classe

C ++

Classe imbriquée statique

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

Java

Classe imbriquée statique (aka Classe de membre statique) [ref]

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

Défini dans une méthode

(par exemple, gestion d'événements)

C ++

Classe locale [ref]

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

Voir aussi les expressions Lambda

Java

Classe locale [ref]

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

Dérogation vs surcharge

Les points de substitution et de surcharge suivants s'appliquent à C ++ et à Java:

  • Une méthode remplacée a le même nom et les mêmes arguments que sa méthode de base.
  • Une méthode surchargée porte le même nom mais des arguments différents et ne repose pas sur l'héritage.
  • Deux méthodes avec le même nom et les mêmes arguments mais avec un type de retour différent sont illégales. Voir les questions relatives à Stackoverflow relatives à la "surcharge avec un type de retour différent dans Java" - Question 1 ; question 2

Polymorphisme

Le polymorphisme est la capacité des objets de différentes classes liés par héritage à répondre différemment au même appel de méthode. Voici un exemple:

  • Classe de base Forme avec zone comme méthode abstraite
  • deux classes dérivées, Square et Circle, implémentent des méthodes de zone
  • La référence de forme pointe sur Carré et la zone est appelée

En C ++, le polymorphisme est activé par les méthodes virtuelles. En Java, les méthodes sont virtuelles par défaut.

Ordre de Construction / Destruction

Ordre de Construction / Destruction

Nettoyage d'objet

En C ++, il est judicieux de déclarer un destructeur comme virtuel pour s'assurer que le destructeur de la sous-classe sera appelé si le pointeur de la classe de base est supprimé.

En Java, une méthode de finalisation est similaire à un destructeur en C ++; cependant, les finaliseurs sont imprévisibles (ils dépendent du GC). Meilleure pratique - utilisez une méthode "close" pour un nettoyage explicite.

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

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

Méthodes et classes abstraites

Concept C ++ Java
Méthode abstraite
déclaré sans implémentation
méthode virtuelle pure
virtual void eat(void) = 0;
méthode abstraite
abstract void draw();
Classe abstraite
ne peut pas être instancié
ne peut pas être instancié; a au moins 1 méthode virtuelle pure
class AB {public: virtual void f() = 0;};
ne peut pas être instancié; peut avoir des méthodes non abstraites
abstract class GraphicObject {}
Interface
aucun champs d'instance
pas de mot-clé "interface", mais peut imiter une interface Java avec les fonctionnalités d'une classe abstraite très similaire à la classe abstraite, mais 1) prend en charge l'héritage multiple; 2) aucun champs d'instance
interface TestInterface {}

Modificateurs d'accessibilité

Modificateur C ++ Java
Public - accessible à tous pas de notes spéciales pas de notes spéciales
Protégé - accessible par sous-classes également accessible par des amis également accessible dans le même paquet
Privé - accessible par les membres également accessible par des amis pas de notes spéciales
défaut le défaut de classe est privé; struct default est public accessible par toutes les classes du même package
autre Friend - un moyen d'accorder l'accès aux membres privés et protégés sans héritage (voir ci-dessous)

Exemple C ++ Friend

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

Le problème des diamants redoutés

Le problème du diamant est une ambiguïté qui se produit lorsque deux classes B et C héritent de A et que la classe D hérite à la fois de B et de C. S'il existe une méthode dans A que B et C ont remplacée et D ne la remplace pas quelle version de la méthode D hérite: celle de B ou celle de C? (de Wikipedia )

Le problème des diamants redoutés

Bien que C ++ ait toujours été sensible au problème des diamants, Java était sensible à Java 8. À l'origine, Java ne supportait pas l'héritage multiple, mais avec l'arrivée des méthodes d'interface par défaut, les classes Java ne peuvent pas hériter de plusieurs implémentations .

Classe java.lang.Object

En Java, toutes les classes héritent, implicitement ou explicitement, de la classe Object. Toute référence Java peut être convertie en type d'objet.

C ++ n'a pas de classe "Object" comparable.

Collections Java & Conteneurs C ++

Les collections Java sont synonymes de conteneurs C ++.

Organigramme des collections Java

Organigramme des conteneurs C ++

Types entiers

Morceaux Min Max Type C ++
(sur LLP64 ou LP64)
Type Java
8 -2 (8-1) = -128 2 (8-1) -1 = 127 carboniser octet
8 0 2 (8) -1 = 255 char non signé -
16 -2 (16-1) = -32,768 2 (16-1) -1 = 32 767 court court
16 0 (\ u0000) 2 (16) -1 = 65,535 (\ uFFFF) non signé court char (non signé)
32 -2 (32-1) = -2,147 milliards 2 (32-1) -1 = 2,147 milliards int int
32 0 2 (32) -1 = 4,295 milliards unsigned int -
64 -2 (64-1) 2 (16-1) - 1 longue* long long
64 0 2 (16) -1 non signé long *
non signé longtemps
-

* API Win64 n'est que 32 bits

Beaucoup plus de types C ++

Membres de la classe statique

Les membres statiques ont une portée de classe par opposition à la portée d'objet

Exemple C ++

// define in header
class Singleton {
   public:
      static Singleton *getInstance();

   private:
      Singleton() {}
      static Singleton *instance;
};

// initialize in .cpp
Singleton* Singleton::instance = 0;

Exemple Java

public class Singleton {
    private static Singleton instance;
    
    private Singleton() {}
    
    public static Singleton getInstance() {
        if(instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

Classes définies dans d'autres constructions

Défini dans une autre classe

C ++

Classe imbriquée [ref] (nécessite une référence à la classe englobante)

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

      private:
         Outer*  outer;
   };
};

Java

[non statique] classe imbriquée (alias classe interne ou classe de membre)

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

Définie statiquement dans une autre classe

C ++

Classe imbriquée statique

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

Java

Classe imbriquée statique (aka Classe de membre statique) [ref]

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

Défini dans une méthode

(par exemple, gestion d'événements)

C ++

Classe locale [ref]

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

Java

Classe locale [ref]

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

Pass-by-value & Pass-by-reference

Beaucoup soutiennent que Java est SEULEMENT pass-by-value, mais il est plus nuancé que cela. Comparez les exemples suivants de C ++ et de Java pour voir les nombreuses variantes de pass-by-value (aka copy) et de pass-by-reference (alias alias).

Exemple C ++ (code complet)

  // passes a COPY of the object
  static void passByCopy(PassIt obj) {
     obj.i = 22;  // only a "local" change
  }

  // passes a pointer
  static void passByPointer(PassIt* ptr) {
     ptr->i = 33;
     ptr = 0; // better to use nullptr instead if '0'
  }

  // passes an alias (aka reference)
  static void passByAlias(PassIt& ref) {
     ref.i = 44;
  }

  // This is an old-school way of doing it.
  // Check out std::swap for the best way to do this
  static void swap(PassIt** pptr1, PassIt** pptr2) {
     PassIt* tmp = *pptr1;
     *pptr1 = *pptr2;
     *pptr2 = tmp;
  }

Exemple Java (code complet)

   // passes a copy of the variable
   // NOTE: in java only primitives are pass-by-copy
   public static void passByCopy(int copy) {
      copy = 33;  // only a "local" change
   }

   // No such thing as pointers in Java
   /*
   public static void passByPointer(PassIt *ptr) {
      ptr->i = 33;
      ptr = 0; // better to use nullptr instead if '0'
   }
   */

   // passes an alias (aka reference)
   public static void passByAlias(PassIt ref) {
      ref.i = 44;
   }

   // passes aliases (aka references),
   // but need to do "manual", potentially expensive copies
   public static void swap(PassIt ref1, PassIt ref2) {
      PassIt tmp = new PassIt(ref1);
      ref1.copy(ref2);
      ref2.copy(tmp);
   }

Héritage vs composition

C ++ et Java sont tous deux des langages orientés objet, ainsi le diagramme suivant s’applique aux deux.

Héritage vs exemple de composition

Downcasting Outcast

Méfiez-vous de l'utilisation du "downcasting" - Le downcasting réduit la hiérarchie d'héritage d'une classe de base à une sous-classe (c.-à-d. L'opposé du polymorphisme). En général, utilisez le polymorphisme et la substitution au lieu de l'instance et du downcasting.

Exemple C ++

// explicit type case required
Child *pChild =  (Child *) &parent;

Exemple Java

if(mySubClass instanceof SubClass) {
   SubClass mySubClass = (SubClass)someBaseClass;
   mySubClass.nonInheritedMethod();
}

Méthodes et classes abstraites

Méthode abstraite

déclaré sans implémentation

C ++

méthode virtuelle pure

virtual void eat(void) = 0;

Java

méthode abstraite

abstract void draw();

Classe abstraite

ne peut pas être instancié

C ++

ne peut pas être instancié; a au moins 1 méthode virtuelle pure

class AB {public: virtual void f() = 0;};

Java

ne peut pas être instancié; peut avoir des méthodes non abstraites

abstract class GraphicObject {}

Interface

aucun champs d'instance

C ++

rien de comparable à Java

Java

très similaire à la classe abstraite, mais 1) prend en charge l'héritage multiple; 2) aucun champs d'instance

interface TestInterface {}


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow