A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 曲佳奇 中级黑马   /  2014-4-12 17:52  /  1182 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 曲佳奇 于 2014-4-12 17:54 编辑
  1. class Demo{
  2.         public static void main(String[] args) {
  3.                 int a1[][] = new int[3][];
  4.                 System.out.println(a1[0]);
  5.                 int a2[][] = new int[3][3];
  6.                 System.out.println(a2[0]);
  7.         }
  8. }
复制代码

输出结果:  null
                [I@1b8d6f7
今天看毕老师基础部分视频 突然间就不明白了 越琢磨越糊涂 都是定义二维数组 有什么区别呢?
输出结果 为什么一个是null 一个是地址呢?

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

5 个回复

倒序浏览
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, 下载次数: 14)

hhh.png

结构.png (45.96 KB, 下载次数: 13)

结构.png

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报 1 0
不好意思传错了张图片
回复 使用道具 举报
一个二维数组
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]根本就不存在。

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
  1. int a1[][] = new int[3][];
  2.          System.out.println(a1[0]);
  3.          int a2[][] = new int[3][3];
  4.          System.out.println(a2[0]);
  5.          
  6.          //a1的第二维没有指定,所以上面打印出来是null。下面给指定一个数组,再打印就不是null了
  7.          a1[0]=new int[2];
  8.          
  9.          System.out.println(a1[0]);
  10.          System.out.println(a2[0]);
复制代码

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报 1 0
二维数组可以看成是一个特殊的一维数组,它里面的元素也都是一维数组。
你定义的二维数组a1里面有3个元素,每个元素又是一个数组,而你没有给里面的数组定义元素个数,系统就没办法给里面数组的元素初始化,就会把里面数组看成一个数组对象,而数组对象初始化的默认值是null,所以你得到的a1[0]为null。
你定义的二维数组a2里面有3个元素,每个元素又是一个带有3个int类型元素的一维数组,系统进行初始化的时候int型的默认值是0,所以a2[0]的结果是一个一维数组,里面有3个元素都是0.所以你打印出来的结果是一个数组的地址值。

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马