把数组作为参数传入一个方法。在该方法中对数组进行一些操作:如果仅仅是插入数据项等一般操作,那么该操作会影响到数组本身;反之,如调整数组大小、对数组赋值等操作,则对数组本身没有影响。各位TX,请问其中的原理是什么喃?附一个例子:
public class Tester {
public static void counter(int count) {
count = 2;
}
public static void changeA1(int[] ints) {
int[] temp = { 4, 5, 6 };
ints = temp;
} public static void changeA2(int[] ints) {
ints[0] = 4;
ints[1] = 5;
ints[2] = 6;
} public static void main(String[] args) {
// Output: 1
// 基本数据类型没有改变。
int count = 1;
counter(count);
System.out.println("count: " + count);
int[] ints = { 1, 2, 3 };
// Output: 1, 2, 3
// 对数组赋值,不会改变原始数组。
changeA1(ints);
for (int i = 0; i < ints.length; i++) {
System.out.print(ints[i] + " ");
}
// Output: 4, 5, 6
// 可以对数组插入新的数据项。
System.out.println();
changeA2(ints);
for (int i = 0; i < ints.length; i++) {
System.out.print(ints[i] + " ");
}
}
}
public class Tester {
public static void counter(int count) {
count = 2;
}
public static void changeA1(int[] ints) {
int[] temp = { 4, 5, 6 };
ints = temp;
} public static void changeA2(int[] ints) {
ints[0] = 4;
ints[1] = 5;
ints[2] = 6;
} public static void main(String[] args) {
// Output: 1
// 基本数据类型没有改变。
int count = 1;
counter(count);
System.out.println("count: " + count);
int[] ints = { 1, 2, 3 };
// Output: 1, 2, 3
// 对数组赋值,不会改变原始数组。
changeA1(ints);
for (int i = 0; i < ints.length; i++) {
System.out.print(ints[i] + " ");
}
// Output: 4, 5, 6
// 可以对数组插入新的数据项。
System.out.println();
changeA2(ints);
for (int i = 0; i < ints.length; i++) {
System.out.print(ints[i] + " ");
}
}
}
解决方案 »
- 这么一段代码为什么有警告
- 如何对两个图形是否重叠进行判断?
- jxl第3问:关于合并过的单元格的自动调整行高
- 为什么我用了SpringLayout后组件就显示不出来了?
- 用Java Scoket连接服务器怎么没反应?有代码,很短。
- 读取图片进行像素读取和处理必须在JApplet下完成么,能否直接在JFrame下完成
- 求,住店计费思路
- 关于传输大对象的问题
- 不能发帖子
- Jbuilder的安装问题,认为自己是高手的请进来,一定给分!!
- Netbean7.1.2打包成jar文件运行找不到数据库配置文件
- 我想截屏 createScreenCapture的效率不够 有没有什么解决方法?或者其他的截屏方法?
数组传递的是地址,也就是指针,传递了一个指向存放该数组地址的指针。
changeA1(ints);没有改变是因为你改变的不是那个地址里的东西。
changeA2(ints);你改变了存放这个数组的地址。
changeA1(ints);的操作你新生成了一个数组,然后将ints这个指针指向这个新数组temp的地址,外面调用方法前的ints指针还是指向原地址,所以没有变化。
changeA2(ints);直接使用原指针改变了原地址的值,所以改变了。
counter(count);相当于复制了一个count传进去,你改动的是复本,所以不影响方法外的值
changeA1(ints);这和上面的相似,不过传的是一个引用的复本,此方法里是把复本的引用转向引用其它地方了,没有改变方法外部的引用,也就是说方法里面的引用和外面的引用指向了不同的地址,
changeA2(ints);虽然传的是引用的复本,但指向的是同一个地址,你用方法里面的引用改动它所指向的值,当然会影响所以指向此地址的引用
唉,不知道说明白没,如果能画图就好了
int[] temp = { 4, 5, 6 };
ints = temp;
}
调用方法的时候相当于把原数组地址复制给ints了,
这里面new了一个数组,把新数组的地址给ints,
原数组没被改变。
楼主这个问题可以归结为传值和传引用的区别问题。
下面开讲故事:
从前有个房间,房间里有份文档,房间还有一把钥匙。 这把钥匙在张三手里。
这时李四来向张三要那份文档。 张三不太喜欢李四,但又怕耽误了
工作不好交代。于是张三就把房间里文档的文档复印了一份,然后把那个复印件交给了李四(这叫传值)。
李四拿到文档后(复印件),胡乱修改一番,心想:张三,这回要你好看。可是他没想到那份原件还好好的在张三的房间里锁着呢。 以上故事对应:
public static void counter(int count) {
count = 2;
}
这个李四不甘心,于是他偷偷地配了一把张三的钥匙(这叫传引用), 准备进入房间修改那份文档。
这事被张三及时发现,他悄悄的把李四配的钥匙换成了另外一个房间的钥匙。
李四去了错误的房间。 张三再次以胜利告终!
以上故事对应:
public static void changeA1(int[] ints) {
int[] temp = new int[3];
ints = temp;
ints[0] = 7;
ints[1] = 8;
ints[2] = 9;
}
李四锲而不舍,他趁张三还沉浸两次胜利的喜悦里,终于成功的配了钥匙(这叫传引用),达到了修改那份文档原件的目的。
以上故事对应:
public static void changeA2(int[] ints) {
ints[0] = 4;
ints[1] = 5;
ints[2] = 6;
}
故事讲完了。 这里需要注意的是无论是传值还是传引用,传的都是复本(文档复印件或配的钥匙)。
--嘿嘿--我也就知道这么多,献丑了!!!