如下所示的代码,如果按照C语言来说则第二次输出时只应该是数组的第一行全为零,可是事实上我们却会看到第一行和第二行都为0:
代码:
public class Test3 { public static void main(String[] args){ int test[][]={{1,2,3}, {4,5,6}, {7,8,9}, {10,11,12}, {13,14,15}}; for(int row=0;row<5;row++){ for(int col=0;col<3;col++){ System.out.print(test[row][col]+"\t"); } System.out.println(); } System.out.println("-------------------"); test[4]=test[3]; test[3]=test[2]; test[2]=test[1]; test[1]=test[0]; for(int col=0;col<3;col++){ test[0][col]=0; } for(int row=0;row<5;row++){ for(int col=0;col<3;col++){ System.out.print(test[row][col]+"\t"); } System.out.println(); } } }
运行结果:
分析产生这个问题的原因:
java中其实是没有二维数组的,只不过java的一维数组可以是一个对象,则可知将几个一维数组当做元素存储到另一个一维数组中则可以得到二维数组。就这样test[1]=test[0]后test[1]这个引用指向的是test[0]原来对应的对象,而test[0]也仍然指向这个对象,则使用for循环改变test[0]原来指向的对象的值后使用test[1]和test[0]这两个引用取出的数据必然是一样的。
当然如果还是想达到只复制前一行的值到这一行,则可以使用.clone()方法来实现,如下所示:
public class Test3 { public static void main(String[] args){ int test[][]={{1,2,3}, {4,5,6}, {7,8,9}, {10,11,12}, {13,14,15}}; for(int row=0;row<5;row++){ for(int col=0;col<3;col++){ System.out.print(test[row][col]+"\t"); } System.out.println(); } System.out.println("-------------------"); test[4]=test[3].clone(); //注意此处和上面的不同,都是将前一行数组对象的复制赋值给当前行 test[3]=test[2].clone(); test[2]=test[1].clone(); test[1]=test[0].clone(); for(int col=0;col<3;col++){ test[0][col]=0; } for(int row=0;row<5;row++){ for(int col=0;col<3;col++){ System.out.print(test[row][col]+"\t"); } System.out.println(); } } }
运行结果:
可以看出,第二次输出中第一行和第二行的数据不一样了。
总之,java是面向对象的语言,前往不要再拿C语言那一套来行事了,两个对象如果只是要赋相同的值而不是指向相同的对象,一定要注意使用.clone()等方法。
今天上了这么一个当,看来基础还有待提高啊。