Что такое & # 8216; семантика значения & # 8217; и & # 8216; семантика указателей & # 8217; имею в виду?
-
03-07-2019 - |
Вопрос
Что подразумевается под & # 8216; семантикой значений & # 8217; и что подразумевается под & # 8216; семантикой неявного указателя & # 8217;?
Решение
Java использует неявную семантику указателей для типов объектов и семантику значений для примитивов.
Семантика значений означает, что вы имеете дело непосредственно со значениями и передаете копии. Дело в том, что когда у вас есть значение, вы можете верить, что оно не изменится за вашей спиной.
С семантикой указателя у вас нет значения, у вас есть «адрес». Кто-то может изменить то, что там, вы не можете знать.
Семантика указателей в C ++:
void foo(Bar * b) ...
... b->bar() ...
Вам нужно *, чтобы запросить семантику указателя, и - > вызывать методы в pointee.
Семантика неявных указателей в Java:
void foo(Bar b) ...
... b.bar() ...
Так как у вас нет выбора использования семантики значений, * не требуется и различие между - > и., следовательно, неявное.
Другие советы
По сути, семантика значения означает, что при присваивании одного значения другому создается копия:
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 и C ++. Однако 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
& # 8230;) фактически являются неизменяемыми. Их значение не может быть изменено, и любое присвоение им заменяет старое значение.
Кроме того, аргументы по-прежнему передаются по значению. Это означает, что значение объекта, переданного функции, может быть изменено, но его ссылка не может:
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 передается по значению. C ++ может использовать семантику как значений, так и ссылок.
Java использует семантику неявного указателя
при доступе к переменной (вы не можете напрямую редактировать ссылку, она автоматически (неявно) разрешается в объекте при доступе), а также использует Семантика передачи по значению
при передаче параметров метода . Р>
Прочитайте Семантика передачи по значению в приложениях Java :
В приложениях Java, когда объект ссылка является параметром для метода, вы передаете копию ссылка (передача по значению), а не ссылка сама. Обратите внимание, что ссылка на объект вызывающего метода и копия указывает на то же самое объект. Это важный различие. Java-приложение делает ничего по другому при прохождении параметры разных типов, такие как C ++ делает. Java-приложения проходят все параметры по значению, что делает копии всех параметров независимо от тип. р>
Коротко: все параметры в Java передаются по значению. Но это не означает, что объект копируется (как по умолчанию в PHP4), но ссылка на этот объект копируется.
Вы найдете все объяснения и подробные примеры на Семантика передачи по значению в приложениях Java