黑马程序员技术交流社区
标题:
二维数组小问题
[打印本页]
作者:
曲佳奇
时间:
2014-4-12 17:52
标题:
二维数组小问题
本帖最后由 曲佳奇 于 2014-4-12 17:54 编辑
class Demo{
public static void main(String[] args) {
int a1[][] = new int[3][];
System.out.println(a1[0]);
int a2[][] = new int[3][3];
System.out.println(a2[0]);
}
}
复制代码
输出结果: null
[I@1b8d6f7
今天看毕老师基础部分视频 突然间就不明白了 越琢磨越糊涂 都是定义二维数组 有什么区别呢?
输出结果 为什么一个是null 一个是地址呢?
作者:
759345779
时间:
2014-4-12 18:33
Java语言中,由于把二维数组看作是数组的数组
你定义的是二维数组其结构如图int a1[][] = new int[3][];这句明确了有三个引用指向数组,但数组长度没确定系统默认引用为空指针所以a1[0]为null
如果int a1[][] = new int[3][3];则系统会默认初始化存储值为0
int a2[][] = new int[3][3];虽然系统会默认初始化但a2[0]是地址指向,打印出的是地址值
要取出并打印二维数组的存储只必须用a[1][2]这样的类型
hhh.png
(192.35 KB, 下载次数: 13)
下载附件
2014-4-2 15:33 上传
结构.png
(45.96 KB, 下载次数: 12)
下载附件
2014-4-12 18:17 上传
作者:
759345779
时间:
2014-4-12 18:34
不好意思传错了张图片
作者:
ehuashao
时间:
2014-4-12 18:35
一个二维数组
int a2[][] = new int[3][3];
由于这时数组已清楚的new出了具体的大小,这是一个3*3的二维数组。在二维数组中,每一行的行标:如a2[1],它的值为二维数组第二行的第一个元素的内存地址即a2[1][0]的地址。这时的a2[0]其实保存的是a2[0][0]的内存地址,所以System.out.println(a2[0]);输出的是地址。
int a1[][] = new int[3][];
二维数组可以理解为一维数组的一个集合,这句代码相当于申明了一个包含三个一维数组的二维数组,但是这三个一维数组却没有确定大小,那他们就没有初始化。按上面的解释,a1[0]现在保存的是a1[0][0]的内存值,但是由于没有初始化,a1[0][0]不存在,所以
System.out.println(a1[0]);
会输出null.
我们也可以System.out.println(a1[0][0]);会发现有空指针异常,也验证我们的结论,这时由于数组没有初始化完成。a1[0][0]根本就不存在。
作者:
leon_hm
时间:
2014-4-12 18:36
int a1[][] = new int[3][];
System.out.println(a1[0]);
int a2[][] = new int[3][3];
System.out.println(a2[0]);
//a1的第二维没有指定,所以上面打印出来是null。下面给指定一个数组,再打印就不是null了
a1[0]=new int[2];
System.out.println(a1[0]);
System.out.println(a2[0]);
复制代码
作者:
清风夜独醉
时间:
2014-4-12 18:55
二维数组可以看成是一个特殊的一维数组,它里面的元素也都是一维数组。
你定义的二维数组a1里面有3个元素,每个元素又是一个数组,而你没有给里面的数组定义元素个数,系统就没办法给里面数组的元素初始化,就会把里面数组看成一个数组对象,而数组对象初始化的默认值是null,所以你得到的a1[0]为null。
你定义的二维数组a2里面有3个元素,每个元素又是一个带有3个int类型元素的一维数组,系统进行初始化的时候int型的默认值是0,所以a2[0]的结果是一个一维数组,里面有3个元素都是0.所以你打印出来的结果是一个数组的地址值。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2