Frage

Was von ‚Wertsemantik‘ gemeint ist, und was unter ‚impliziter Zeiger Semantik‘ gemeint ist?

War es hilfreich?

Lösung

Java verwendet implizite Zeiger Semantik für Objekttypen und Wertesemantik für Primitive.

Wert Semantik bedeutet, dass Sie direkt mit Werten umgehen und dass Sie Kopien herumreichen. Der Punkt hier ist, dass, wenn Sie einen Wert haben, der Sie vertrauen können, es wird nicht hinter dem Rücken ändern.

Mit Zeiger Semantik, Sie haben keinen Wert, Sie haben eine ‚Adresse‘. Jemand anderes könnte ändern, was da ist, kann man nicht wissen.

Zeiger Semantics in C ++:

void foo(Bar * b) ...
... b->bar() ...

Sie benötigen ein * für Zeiger Semantik zu stellen und -> Methoden auf dem pointee zu nennen

.

Implizite Pointer Semantics in Java:

void foo(Bar b) ...
... b.bar() ...

Da Sie haben nicht die Wahl Wert Semantik verwendet, wird die * nicht erforderlich, noch die Unterscheidung zwischen -..> Und damit die impliziten

Andere Tipps

Grundsätzlich Wert Semantik bedeutet, dass ein Wert in einer anderen Zuordnung erstellt eine Kopie:

int x = 1;
int y = x;
x = 2; // y remains the same!

Ein Sonderfall ist ein Funktionsaufruf, die ein Argument übergeben werden:

void f(int x) {
    x = 5;
}

int a = 1;
f(a);
// a is still 1

Das ist eigentlich das gleiche für Java und C ++. Allerdings Java kennt nur ein paar primitive Typen, darunter int, double, boolean und char, zusammen mit Aufzählungen, die auf diese Art und Weise verhalten. Alle anderen Typen verwenden Referenz Semantik was bedeutet, dass eine Zuordnung von einem Wert zum anderen tatsächlich einen Zeiger leitet stattdessen die zugrunde liegenden Wert des Kopierens:

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.

Es gibt ein paar Einschränkungen jedoch. Zum Beispiel sind viele Referenztypen (String, Integer ...) tatsächlich immutables. Ihr Wert kann nicht geändert werden und jede Zuordnung zu ihnen überschreibt den alten Wert.

Auch Argumente noch von Wert übergeben bekommen. Dies bedeutet, dass der Wert eines Objekts eine Funktion übergeben geändert werden kann, aber seine Referenz kann nicht:

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 ist Pass von Wert. C ++ können beide, den Wert und Referenzsemantik.

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

Java verwendet implicit pointer semantics auf Variablenzugriff (Sie nicht direkt die Referenz bearbeiten, es autmatically (implizite) zum Objekt über den Zugang aufgelöst wird) und auch verwendet Pass-by-Value semantics auf Methode Parameter übergeben .

Lesen Pass-by-value-Semantik in Java-Anwendungen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top