日期:2014-05-20 浏览次数:20855 次
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所引用的对象