Что означают семантику значения и семантику указателя?

Что подразумевается под "семантикой значений и что подразумевается под" семантикой неявного указателя "?

Ответы

Ответ 1

Java использует семантику неявного указателя для типов объектов и семантики значений для примитивов.

Значение семантики означает, что вы имеете дело непосредственно со значениями и передаете копии. Дело здесь в том, что когда у вас есть ценность, вы можете доверять, что он не изменится за вашей спиной.

С семантикой указателя у вас нет значения, у вас есть "адрес". Кто-то другой может изменить то, что есть, вы не можете знать.

Семантика указателя в С++:

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

Вам понадобится *, чтобы попросить семантику указателя и → вызвать методы на pointee.

Семантика неявных указателей в Java:

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

Поскольку у вас нет выбора использования семантики значения, * не требуется или различие между → и., следовательно, неявное.

Ответ 2

В принципе, семантика значения означает, что присвоение одного значения другому создает копию:

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

Частным случаем является вызов функции, который получает аргумент:

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

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

Это на самом деле то же самое для Java и С++. Однако Java знает только несколько примитивных типов, среди которых int, double, boolean и char, а также перечисления, которые ведут себя таким образом. Все остальные типы используют ссылочную семантику, что означает, что присвоение одного значения другому фактически перенаправляет указатель вместо копирования базового значения:

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.

Однако есть несколько предостережений. Например, многие ссылочные типы (String, Integer...) на самом деле являются неизменяемыми. Их значение не может быть изменено, и любое присваивание им отменяет старое значение.

Кроме того, аргументы по-прежнему передаются по значению. Это означает, что значение объекта, переданного функции, может быть изменено, но его ссылка не может:

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!

Ответ 3

Java передается по значению. С++ может использовать как значения, так и ссылочную семантику.

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

Ответ 4

Java использует implicit pointer semantics для доступа к переменной (вы не можете напрямую редактировать ссылку, она автоматически (неявно) получает разрешение на объект при доступе), а также использует Pass-by-Value semantics при передаче параметров метода.

Прочитайте Семантика Pass-by-value в приложениях Java:

В приложениях Java, когда объект ссылка является параметром метода, вы передаете копию ссылку (передать по значению), а не ссылка сама. Обратите внимание, что вызов метода объекта ссылка и копия указывает на то же самое объект. Это важный различие. Приложение Java делает ничего не изменилось при прохождении параметры различных типов, таких как С++ делает. Приложения Java проходят все параметров по значению, копии всех параметров независимо от тип.

Короткие: все параметры в Java передаются по значению. Но это не означает, что объект копируется (например, по умолчанию в PHP4), но ссылка на этот объект копируется.

Вы увидите все объяснения и подробные примеры Семантика Pass-by-value в приложениях Java