Что означают семантику значения и семантику указателя?
Что подразумевается под "семантикой значений и что подразумевается под" семантикой неявного указателя "?
Ответы
Ответ 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