‘重视语义’和’指针语义’是什么意思?

‘值语义’是什么意思,’隐式指针语义’是什么意思?

Java正在使用Object类型的隐式指针语义和基元的值语义。

值语义意味着您直接处理值并传递副本。 这里的要点是,当你有一个价值时,你可以相信它不会在你背后改变。

使用指针语义,您没有值,您有一个’地址’。 别人可以改变那里的东西,你无法知道。

C ++中的指针语义:

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

你需要一个*来询问指针语义和 – >来调用指针对象上的方法。

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只知道一些基本类型,其中包括intdoublebooleanchar ,以及以这种方式运行的枚举。 所有其他类型都使用引用语义,这意味着将一个值赋值给另一个实际上重定向指针而不是复制基础值:

 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! ax = 32; //bx is now also changed. 

但是有一些警告。 例如,许多引用类型( StringInteger …)实际上是不可变的。 它们的值无法更改,对它们的任何赋值都会覆盖旧值。

此外,参数仍然按值传递。 这意味着传递给函数的对象的值可以更改,但其引用不能:

 void f(Foo foo) { foo.x = 42; } void g(Foo foo) { foo = new Foo(42); } Foo a = new Foo(23); f(a); // ax is now 42! Foo b = new Foo(1); g(b); // b remains unchanged! 

Java是按值传递的。 C ++可以使用值,值和引用语义。

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

Java对变量访问使用implicit pointer semantics (您不能直接编辑引用,它可以自动(隐式)在访问时解析为Object),并且还使用Pass-by-Value semantics 方法参数的 Pass-by-Value semantics

读取Java应用程序中的按值传递语义 :

在Java应用程序中,当对象引用是方法的参数时,您传递的是引用的副本(按值传递),而不是引用本身。 请注意,调用方法的对象引用和副本指向同一个对象。 这是一个重要的区别。 当传递不同类型的参数(如C ++)时,Java应用程序没有任何不同。 Java应用程序按值传递所有参数,从而复制所有参数,而不管类型如何。

简短:Java中的所有参数都按值传递。 但这并不意味着Object被复制(就像PHP4中的默认值一样),但是对该对象的引用被复制了。

您将在Java应用程序中看到有关Pass-by-value语义的所有解释和深入示例