日期:2014-05-20  浏览次数:20754 次

国庆在家自学java2天,遇到个一个关于数组的问题没搞明白
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);
print_mat(b);
b=add(a);
System.out.println("修改后b2数据的长度:"+b[1].length);

print_mat(b);
}

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;
return d;
}

}




上面这个带码中,申明的数组b每一维度的长度只有1个元素,为什么最后可以打印出超过1个元素的数据?

------解决方案--------------------
Java code

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所引用的对象