Java Language
Comparaison C ++
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
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 )
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
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.
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 {}