在该计划中
public static void main(String[] args){
int x = 1;
int y = 2;
int[] z = new int[]{x, y};
z[0] = 3;
System.out.println(x); //prints 1
}
Run Code Online (Sandbox Code Playgroud)
我预计会打印出3张.但是1是.为什么?我认为Java只复制引用,即当我们将refrence传递给方法时,该方法将使用对同一对象的另一个引用.它就像C++指针和原始类型.
所以我试着咨询JLS 10.6并没有找到任何有用的东西.也许我对Java中的原始类型有一些误解.你能澄清一下吗?
这是一个简单的例子:
1| window.gamelogic = {};
2| var g = gamelogic;
3| g.points = 1;
4| g.array = ["foo","bar"];
5| var b = g.points;
6| b = b + 1;
7| console.log(window.gamelogic);
8| console.log(b);
Run Code Online (Sandbox Code Playgroud)
这将打印:
Object { points=1, array=[2] }
2
Run Code Online (Sandbox Code Playgroud)
所以这里有两件事需要注意:
一个(看似本地的)变量 - g - 当设置为全局对象并更新时,也会更新golbal对象 - window.gamelogic.(更新g也更新了window.gamelogic).
本地int,b(设置为全局int,points)在更改时不会更新全局变量.(更新b没有更新window.gamelogic.points)
基于第一点,可以认为当var指向全局对象时,实际上只是创建指向该全局对象的相同内存位置的另一个指针.这可以解释为什么更新g也会更新window.gamelogic.
但是,b不更新window.gamelogic.points似乎反驳了这一论点.
这里发生了什么?