日期:2014-05-20 浏览次数:21077 次
public class TestJava2_1 {
public static void main(String aaa[]) {
int[][] a = { { 1, 2, 3, 4 }, { 5, 6, 7, 8, 9 } };
int[][] b = new int[2][1];
System.out.println("原始数据a:");
print_mat(a);
System.out.println("原始b2数据的长度:" + b[1].length);//这种说法是错误的
System.out.println("这种说话是正确的,原始b数据的长度:" + b.length);//这种说话是正确的
System.out.println("这种说话是正确的,原始b[0]数据的长度:" + b[0].length);//这种说话是正确的
System.out.println("这种说话是正确的,原始b[1]数据的长度:" + b[1].length);//这种说话是正确的
//数组是b一个对象,其中b[0],b[1] 又是一个数组,又是一个对象
print_mat(b);
b = add(a);//此时a中的内容已经被修改,引用b指向a中的内容,从这里开始,垃圾回收器就会收拾b中的内容。下面的输出只跟a有关
System.out.println("修改后b2数据的长度:" + b[1].length);//这种说法是错误的
System.out.println("这种说话是正确的,原始b数据的长度:" + b.length);//这种说话是正确的
System.out.println("这种说话是正确的,原始b[0]数据的长度:" + b[0].length);//这种说话是正确的
System.out.println("这种说话是正确的,原始b[1]数据的长度:" + b[1].length);//这种说话是正确的
print_mat(b);//实际上打印a中的内容
//print_mat(a);
}
public static void print_mat(int c[][]) {
for (int i = 0; i < c.length; i++) {
for (int j = 0; j < c[i].length; j++)
System.out.print(c[i][j] + " ");
System.out.print("\n");
}
}
public static int[][] add(int d[][]) {//数组是一个对象,传引用进来了
for (int i = 0; i < d.length; i++)
for (int j = 0; j < d[i].length; j++)
d[i][j] += 10;
//你修改引用指向的值,所以原来的a数组中的内容已经改变,你可以用print_mat(a);看个究竟,
//所以这种写法是相当糟糕的,因为你只是为了add,而不是为了modify
return d;
}
}
------解决方案--------------------
上面这个带码中,申明的数组b每一维度的长度只有1个元素,为什么最后可以打印出超过1个元素的数据?
int[][] b=new int[2][1]; //b一开始,每一维的长度只有1个元素,这个是没问题的
....
b=add(a); //后来执行这里以后,b就改变了,b不再引用原来的new int[2][1]数组对象,而是引用add(a)返回的数组对象,所以b的每一维的元素和add(a)返回的数组对象的每一维的元素的个数一样
LZ要知道赋值语句的意义
b = new xxx; b是个局部(引用)变量,它引用new xxx所生成的对象
b = yyy; 改变b的指向,让b重新引用另一个xxx所引用的对象