Que signifient les termes "sémantique de valeur" et "sémantique de pointeur"?
-
03-07-2019 - |
Question
Qu'entend-on par "sémantique de valeur & # 8217;" et par "sémantique de pointeur implicite"?
La solution
Java utilise une sémantique de pointeur implicite pour les types d’objet et une sémantique de valeur pour les primitives.
La sémantique des valeurs signifie que vous traitez directement avec les valeurs et que vous transmettez des copies. Le point ici est que lorsque vous avez une valeur, vous pouvez avoir confiance que cela ne changera pas dans votre dos.
Avec la sémantique du pointeur, vous n’avez pas de valeur, vous avez une "adresse". Quelqu'un d'autre pourrait changer ce qu'il y a là-bas, vous ne pouvez pas savoir.
Sémantique de pointeur en C ++:
void foo(Bar * b) ...
... b->bar() ...
Vous avez besoin d'un * pour demander la sémantique du pointeur et - > appeler des méthodes sur la pointee.
Sémantique implicite du pointeur en Java:
void foo(Bar b) ...
... b.bar() ...
Etant donné que vous n'avez pas le choix d'utiliser la sémantique de valeur, le * n'est pas nécessaire ni la distinction entre - > et., d’où l’implicite.
Autres conseils
Fondamentalement, la sémantique des valeurs signifie que l'attribution d'une valeur à une autre crée une copie:
int x = 1;
int y = x;
x = 2; // y remains the same!
Un cas particulier est un appel de fonction auquel un argument est passé:
void f(int x) {
x = 5;
}
int a = 1;
f(a);
// a is still 1
C’est en fait la même chose pour Java et C ++. Cependant, Java ne connaît que quelques types primitifs, parmi lesquels int
, double
, booléen
et char
, ainsi que enums qui se comportent de cette manière. Tous les autres types utilisent la sémantique de référence, ce qui signifie qu'une affectation d'une valeur à une autre redirige en réalité un pointeur au lieu de copier la valeur sous-jacente:
class Foo {
int x;
public Foo(int x) { this.x = x; }
}
Foo a = new Foo(42);
Foo b = a; // b and a share the same instance!
a.x = 32;
//b.x is now also changed.
Il y a cependant quelques réserves. Par exemple, de nombreux types de références ( String
, Entier
…) sont en réalité immuables. Leur valeur ne peut pas être modifiée et leur affectation remplace l'ancienne valeur.
De plus, les arguments sont toujours passés par valeur. Cela signifie que la valeur d'un objet transmis à une fonction peut être modifiée mais que sa référence ne peut pas:
void f(Foo foo) {
foo.x = 42;
}
void g(Foo foo) {
foo = new Foo(42);
}
Foo a = new Foo(23);
f(a);
// a.x is now 42!
Foo b = new Foo(1);
g(b);
// b remains unchanged!
Java est transmis par valeur. C ++ peut utiliser à la fois la sémantique de valeur et de référence.
Java utilise la sémantique du pointeur implicite
sur accès de variable (vous ne pouvez pas éditer directement la référence, elle est automatiquement (implicitement) résolue en objet lors de l'accès) et utilise également Sémantique pass-par-valeur
sur les paramètres de méthode en passant .
Lire Sémantique pas à pas dans les applications Java :
Dans les applications Java, lorsqu'un objet référence est un paramètre à une méthode, vous passez une copie du référence (passage par valeur), pas le référencer lui-même. Notez que le référence de l'objet de la méthode d'appel et la copie pointe vers le même objet. C'est un important distinction. Une application Java ne rien de différent en passant paramètres de types variés comme C ++ Est-ce que. Les applications Java passent tout paramètres par valeur, rendant ainsi des copies de tous les paramètres indépendamment de type.
Court: Tous les paramètres en Java sont passés par valeur. Mais cela ne signifie pas qu'un objet est copié (comme dans PHP4 par défaut), mais que la référence à cet objet est copiée.
Vous verrez toutes les explications et les exemples détaillés sur Sémantique pas à pas dans les applications Java