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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 梁志冰 中级黑马   /  2012-8-21 23:17  /  2037 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Demo1
{
    public static void main(String[] args)
    {
          int[][] arr=new int[3][]; //二维数组中有3个一维数组,但这三个数组没有初始化
          System.out.println(arr[0]);  //输出结果为null,即每一个一维数组的初始值都是null
         arr[0]=new int[4]; //定义了一维数组的长度为4,默认初始值都为0
          System.out.println(arr[0]);  //输出结果为[I@e3f6d,arr[0]的一数组的首地址
           System.out.println(arr[0][0]);//输出结果为0      
    }
}

问题:1,根据数组的定义格式  :    元素类型[]  数组名=new 元素类型[元素个数或长度]      ,数组必须具备元素类型 、 数组名和数组长度或元素个数;为什么在二维数组中,可以不定义一维数组的长度或元素个数?例如:int [] [] arr=new int[3][];     new int[3][] 没有对[] 进行定义数组的长度或者元素个数
问题:2,既然int [][] arr=new int[3][]; arr[0]=new int [4]可以成立。那我做这样的假想,我这样定义一个数组   String[] arr2=new String[4];   arr2[1]=new String[3];为什么会报错?数组不是引用数据类型吗?再说了,int [][] arr=new int[3][];中的一维数组不是null吗,在内存中没有任何的记录,它却可以进行arr[0]=new int[4]操作;为什么上述假想就不可以实现呢?

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
问题1:在定义一维数组时,可以不定义长度,比如int[] arr={},这样定义的话会自动根据你大括号里的数据来确定数组的长度,这是一种简化的定义方式,二维数组同理,但是二维数组必须定义前面的一个中括号
问题2:因为你先定义arr是int类型的,你定义String[] arr2=new String[4];   arr2[1]=new String[3];为什么会报错?是因为后定义的是string字符串类型的,这两个类型都不一样,当然会报错了。
int [][] arr=new int[3][];中的一维数组确实是null,但是进行arr[0]=new int[4]操作是给二维数组arr[0][]给他初始化,即初始化为arr[0][4],这个当然是可以的

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1

查看全部评分

回复 使用道具 举报
问题1: 个人理解,二维数组作为一个行列的形式出现,定义二维的长度可以不定义一维数组的长度,可能是出于对内存上的考虑,一旦定义长度就会分配内存空间。
         二维数组中定义行数不定义列数,可以根据实际的情况来动态决定列数也就是一维数组的长度

问题2: 这个问题有点问的不应该既然 int [][] arr=new int[3][]; arr[0]=new int [4]; 这个是成立的 String[][] arr = new String[3][]; String[0] = new String[4];
            这个不是可行的吗?
        String[] arr2=new String[4];   arr2[1]=new String[3];  这个报错,是因为arr2是一维数组,里面存放的是String的对象,arr2[1] 对应的是一个String的对象
        那么他怎么能接受一个String数组的赋值操作呢?

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1

查看全部评分

回复 使用道具 举报
1.事实上从数组底层的运行机制来说,java里没有多维数组
因为数组的定义是 type[] arrName,是一维的,是引用类型
type[][] arrName意思是数组元素也是一个引用,这个引用指向一个一维数组.可以把它看成一个一维数组,它的元素是type[]
利用arrName = new type[length][]来进行初始化,这符合数组定义规则,你不必为它的元素一一赋值,系统会分配成null为它元素(type[])的初值

2.String[] arr2=new String[4];   arr2[1]=new String[3];会报错是因为arr2在定义的时候,元素类型就规定是String,而不能是数组(String[])

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1

查看全部评分

回复 使用道具 举报
问题已解决,谢谢大家!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马