黑马程序员技术交流社区

标题: 数组的初始化问题 [打印本页]

作者: 程宏志    时间: 2012-11-6 22:33
标题: 数组的初始化问题
本帖最后由 程宏志 于 2012-11-6 23:24 编辑

在数组这样的定义:一维数组:int []arr=new int[];
                               二维数组:int [][]arry=new int[][];
为什么这样初始化时,是错误的呢?请大侠们详细解答,我不要要那种结果说,是什么规则或是就不能这么定义的
我需要的是深层的解释,要原理性的东西!
           其实 我想任何规定都有一个前提存在的  是因为在发生问题后 进行改进而来的 我想我这问题 之前应该有很多人疑惑。什么事来之前都有一个根源的 现在我就困在这点上 我想知道为什么 ,有点本质上的解释。就像老师讲引用型数据在内存中的运算的原理一样 ,给个根源上的,不要说什么规定的,什么法则什么的!需要的是本质上的解释!
作者: 王振    时间: 2012-11-6 22:53
在很多教材里确实只是如此定义,并没有讲为什么应该这样。
以下是我个人的理解:
1、数组是一个对象,这一点毋庸置疑。
2、int []arr=new int[];
拿这一句来讲,你是在右边创建了一个int[]类型的对象,然后赋值给了一个int[]引用。
这个过程,和你这样定义没有什么区别: Student stu = new Student();
同样的右侧创建对象,赋值给左边。
3、int [][]arry=new int[];
基于以上说明,这里为什么会错?
你在右侧创建了一个int[]类型的对象,却要把它赋值给一个int[][]类型的引用,当然会出现类型转换错误。
这种错误就和以下情况相同:Dog  dog = new Cat();

或许你会质疑int[]和int[][]怎么会不是同一种类型呢?不过就是多了一个[]而已,不是吗?
这里如果你类比一下int 和int[]有无区别即可,这两种数据类型也只是差一个[]而已。

希望可以解决你的困惑。
作者: 程宏志    时间: 2012-11-6 23:09
其实 我想任何规定都有一个前提存在的  是因为在发生问题后 进行改进而来的 我想我这问题 之前应该有很多人疑惑。什么事来之前都有一个根源的 现在我就困在这点上 我想知道为什么 ,有点本质上的解释。就像老师讲引用型数据在内存中的运算的原理一样 ,给个根源上的,不要说什么规定的,什么法则什么的!本质上的解释!
作者: 程宏志    时间: 2012-11-6 23:14
王振 发表于 2012-11-6 22:53
在很多教材里确实只是如此定义,并没有讲为什么应该这样。
以下是我个人的理解:
1、数组是一个对象,这一 ...

我上面打错了 其实是 这样的 二维数组:int [][]arry=new int[][];
我主要是想问初始化这样的问题

作者: 王振    时间: 2012-11-6 23:54
。。。。。。这个还真是让人吐血啊
那你就想一下二维数组是如何实现的。无非就是在一维数组内再放置一维数组。
以arr[][]为例说明,
如果画内存图的话,肯定是先在堆内存中画一个数组,然后再另外创建一批数组,然后将后面创建的数组的地址值依次赋给arr[0],arr[1].....
创建二维数组对象时,系统是需要分配内存空间的。
如果你不通过int [][]arry=new int[5][];的方式告诉系统第一层数组的长度,那么它怎么知道该为你的第二层数组分配多少个内存空间呢?
只有上面的显式说明,系统才会知道该如何为你的二维数组分配内存:
即首先分配内存给一个长度为5的存放引用类型数据的数组,然后分配内存给5个存放int类型数据的数组。因为在其底层,哪种数据类型该分配多少空间都是规定好的。所以它能够毫无疑问的把这个二维数组的内存空间分配出来。

但是,如果你只是给一个int [][]arry=new int[][];的话,它不知道第二维数组的个数,也就不知道总共该分配给这个二维数组多大的内存空间。

不知这样理解如何?
作者: 程宏志    时间: 2012-11-7 21:33
王振 发表于 2012-11-6 23:54
。。。。。。这个还真是让人吐血啊
那你就想一下二维数组是如何实现的。无非就是在一维数组内再放置一维数 ...

问了好几个老师,他们也说不出来,只告诉我就是这样的,这就是规则,不过你的解释让我多少明白些!谢谢!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2