pur*_*lue 15 java variables scope
我的变量范围有问题.
public static void main(String[] args){
int[] test={1,2,3};
test(test);
System.out.println(test[0]+" "+test[1]+" "+test[2]);
}
static void test(int[] test){
test[0]=5;
}
Run Code Online (Sandbox Code Playgroud)
我期望输出到1 2 3,但结果是5 2 3.为什么我在方法中更改了数组中的值,但原始数组发生了变化?
Bri*_*ach 10
Java中的数组是一个对象.当您通过创建数组时new,它将在堆上创建,并返回一个引用值(类似于C中的指针)并将其分配给您的变量.
在C中,这将表示为:
int *array = malloc(10 * sizeof(int));
Run Code Online (Sandbox Code Playgroud)
将该变量传递给方法时,您将传递的参考值(已复制)传递给方法中的本地(堆栈)变量.不复制数组的内容,只复制参考值.再次,就像将指针传递给C中的函数一样.
因此,当您通过该引用修改方法中的数组时,您将修改堆上存在的单个数组对象.
您评论说您通过int[] temp=test...再次对数组进行了"复制" ,这只会生成指向内存中单个数组的引用值(指针)的副本.你现在有三个变量都对同一个数组保持相同的引用(一个在你main()的方法中,两个在你的方法中).
如果要复制数组的内容,Java会在Arrays类中提供一个静态方法:
int[] newArray = Arrays.copyOf(test, test.length);
Run Code Online (Sandbox Code Playgroud)
这将在堆上分配一个新的数组对象(由第二个参数指定的大小),将现有数组的内容复制到它,然后返回对该新数组的引用.
| 归档时间: |
|
| 查看次数: |
22075 次 |
| 最近记录: |