class ArrayArgument{ public static void main(String args[]){
int x[]={11,12,13,14,15};
display(x);
change(x);
display(x);
}
public static void change(int x[]){
int y[]={21,22,23,24,25};
x=y;
}
public static void display(int x[]){
for(int i=0;i <x.length;i++)
System.out.print(x[i]);
System.out.println( " ");
}
}
运行结果: 11,12,13,14,15
11,12,13,14,15
数组,对象,和接口都属于引用类型
把数组作为参数传递,传过去的只是它的一个引用,把这个引用指向新的数组,对原数组没有改变
如果程序做些变动:将
x=y; 改成for(int i=0;i <x.length;i++)
x[i]=y[i]
则运行结果变为: 11,12,13,14,15
21,22,23,24,25 这是为什么?想不通
int x[]={11,12,13,14,15};
display(x);
change(x);
display(x);
}
public static void change(int x[]){
int y[]={21,22,23,24,25};
x=y;
}
public static void display(int x[]){
for(int i=0;i <x.length;i++)
System.out.print(x[i]);
System.out.println( " ");
}
}
运行结果: 11,12,13,14,15
11,12,13,14,15
数组,对象,和接口都属于引用类型
把数组作为参数传递,传过去的只是它的一个引用,把这个引用指向新的数组,对原数组没有改变
如果程序做些变动:将
x=y; 改成for(int i=0;i <x.length;i++)
x[i]=y[i]
则运行结果变为: 11,12,13,14,15
21,22,23,24,25 这是为什么?想不通
class ArrayArgument{ public static void main(String args[]){
int x[]={11,12,13,14,15};
display(x);
change(x);
display(x);
}
public static void change(int x[]){ //这里传的是一个int数组的引用x
int y[]={21,22,23,24,25};
x=y; //改变的只是一个int[]类型的引用x,没有改变x之前引用的对象
}
public static void display(int x[]){
for(int i=0;i <x.length;i++)
System.out.print(x[i]);
System.out.println( " ");
}
}
为什么对引用的拷贝做以下操作:
x=y; 改成for(int i=0;i <x.length;i++)
x[i]=y[i]
则运行结果变为: 11,12,13,14,15
21,22,23,24,25
这是为什么?
public static void change(int x[]){
int y[]={21,22,23,24,25};
x=y;
}
调用这个方法的时候,会创建一个新的变量x(不同于传入的数组名x),它指向你传入的那个数组的地址,楼主的源码里它是指向{11,12,13,14,15}这个数组的。执行 x=y;后,它指向了{21,22,23,24,25}。而main()中的x仍然指向{11,12,13,14,15}.
而当执行 x[i]=y[i];时;是将y[i]的值写入x[i]所在的内存空间。
建议楼主了解一下java程序运行时的内存分配情况,马士兵的java培训视频里有几节是介绍这个的