Dav*_*rre 14
Java正在使用Object类型的隐式指针语义和基元的值语义.
值语义意味着您直接处理值并传递副本.这里的要点是,当你有一个价值时,你可以相信它不会在你背后改变.
使用指针语义,您没有值,您有一个'地址'.别人可能会改变那里的东西,你无法知道.
C++中的指针语义:
void foo(Bar * b) ...
... b->bar() ...
Run Code Online (Sandbox Code Playgroud)
你需要一个*来询问指针语义和 - >来调用指针对象上的方法.
Java中的隐式指针语义:
void foo(Bar b) ...
... b.bar() ...
Run Code Online (Sandbox Code Playgroud)
由于您没有使用值语义的选择,因此不需要*,也不需要区分 - >和.因此是隐式的.
Kon*_*lph 14
基本上,值语义意味着将一个值分配给另一个值会创建一个副本:
int x = 1;
int y = x;
x = 2; // y remains the same!
Run Code Online (Sandbox Code Playgroud)
一个特例是一个函数调用,它传递一个参数:
void f(int x) {
x = 5;
}
int a = 1;
f(a);
// a is still 1
Run Code Online (Sandbox Code Playgroud)
对于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.
Run Code Online (Sandbox Code Playgroud)
但是有一些警告.例如,许多引用类型(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!
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8095 次 |
| 最近记录: |