方法调用时发生 值 传递。main中建立的x并不是change(int x[])中的x,
当执行到change(x);的时候,change()方法生成local变量x,该x指向change()中建立的y,与main中的x,无干。
我表达的不够清楚,希望有帮助于你
当执行到change(x);的时候,change()方法生成local变量x,该x指向change()中建立的y,与main中的x,无干。
我表达的不够清楚,希望有帮助于你
解决方案 »
- 怎么实现,记事本的撤销和查找功能?
- 请教对话框如何在任务栏显示??
- qingwei请大侠指点迷经,怎样打jar包啊? 怎样把自己得东西发布在JAVA中?
- 困扰我多时的简单初级问题!回答就给分!
- 如何在APPLET中载入一幅BMP图片?
- 纪念抗日战争中死去的最可爱的人们(无名氏,有名的)以及无辜的中国老百姓,提前纪念
- 如何在java中访问注册表
- 在线等待,高分求救???
- 为什么要限制我进入csdn(说我的ip被禁止进入)?
- 求大神帮忙看看这个问题,报错可能的原因及解决办法
- 现在java开发中流行通过什么方式实现对数据库操作?就好像Visual Stadio通过ADO访问数据库。
- 简单 java 求救!
public static void change(int x[]){
int y[]={21,22,23,24,25};
for (int i=0; i<x.length; i++) {
x[i] = y[i];
}
}
X(main)与X(change)实际上指向同一内存地址,如果在change()方法内执行:
x[0]=100;你再看效果,肯定变了。
是程序运行结果却没有改变值请问为什么?
因为java中数组是作为对象的,对它的调用是按句柄传递的,但句柄本身按值传递。在方法中可以改变它引用的对象,使它指向其它数组,并对新的数组进行操作,担从方法返回后,它仍然指向原来的数组。
但看看下面的,比较一下就知道了:
public 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[]){
for(int i = 0 ; i < 5 ; i++) x[i] = i + 1;
int y[]={21,22,23,24,25};
x=y;
for(int i = 0 ; i < 5 ; i++) x[i] = i + 31;
display(y);
}
public static void display(int x[]){
for(int i=0;i<x.length;i++)
System.out.print(x[i]+" ");
System.out.println(" ");
}
}
能对下面的代码解除释吗?
public 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[]){
for(int i = 0 ; i < 5 ; i++) x[i] = i + 1;
int y[]={21,22,23,24,25};
x=y;
for(int i = 0 ; i < 5 ; i++) x[i] = i + 31;
display(y);
}
public static void display(int x[]){
for(int i=0;i<x.length;i++)
System.out.print(x[i]+" ");
System.out.println(" ");
}
}
//这时x还是指向原来数组,所以对x中的元素的改变是有效的
int y[]={21,22,23,24,25};
x=y;
//这时x指向了数组y
for(int i = 0 ; i < 5 ; i++) x[i] = i + 31;
display(y);
//由于x指向数组y,对x的改变实质上是改变了y中的元素//从方法返回后,它仍然指向原来的数组,但此时它的值已经变为{1,2,3,4,5}了。
除原始类型,其它类型(也就是引用类型)都是传引用调用的。
但是,要想使改动在调用方法里有效,被调方法里只能对传进来的对象做内容上的变动,对句柄重新赋值毫无意义。
比如:
void f(StringBuffer sb) {
sb.append("ok");//有效
sb = new StringBuffer();//无效
}明白了吗?特别的,对于不可变类,如java.lang.String,java.math.BigDecimal永远无法达到那样的效果。