Question

Qu'entend-on par "sémantique de valeur & # 8217;" et par "sémantique de pointeur implicite"?

Était-ce utile?

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.

http://javadude.com/articles/passbyvalue.htm

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top