首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java相关 >

国庆在家自学java2天,遇到个一个关于数组的有关问题没搞明白

2012-02-17 
国庆在家自学java2天,遇到个一个关于数组的问题没搞明白public class TestJava2_1{public static void mai

国庆在家自学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所引用的对象

热点排行