黑马程序员技术交流社区

标题: 关于数组,一个你没想到的问题!!!!!!! [打印本页]

作者: ↘ふ紫铯幽夢    时间: 2014-6-12 16:23
标题: 关于数组,一个你没想到的问题!!!!!!!
本帖最后由 ↘ふ紫铯幽夢 于 2014-6-12 16:24 编辑

请看下面代码 ,为什么会报错?
int[] arr={1,2};
arr={1};
谁能详细解释下,为什么这样写不允许。。。。。。
作者: Gaara33    时间: 2014-6-12 17:10
数组一旦初始化,长度就不能改了,不然的话数组自己直接自己增删数据了,那就不用总是转到集合区增删了。
作者: 姿_`态    时间: 2014-6-12 17:14
那就有是一个数组了吧
作者: ↘ふ紫铯幽夢    时间: 2014-6-12 18:32
本帖最后由 ↘ふ紫铯幽夢 于 2014-6-12 18:36 编辑
Gaara33 发表于 2014-6-12 17:10
数组一旦初始化,长度就不能改了,不然的话数组自己直接自己增删数据了,那就不用总是转到集合区增删了。 ...
  1. int[] arr={1,2};
  2. arr=new int[]{1};
复制代码
那好 请看,这样写就是对的。
下面这样写又是错的:
  1. int[] arr=new int[]{1,2};
  2. arr={3,4};
复制代码
如何解释?


作者: Gaara33    时间: 2014-6-12 18:36
↘ふ紫铯幽夢 发表于 2014-6-12 18:32
那好 请看,这样写就是对的。

你这个是又新建了一个对象,第一句对应的对象已经被你舍弃了,arr指向了一个新的数组对象,之前的代码中只有一个对象
作者: ↘ふ紫铯幽夢    时间: 2014-6-12 18:39
Gaara33 发表于 2014-6-12 18:36
你这个是又新建了一个对象,第一句对应的对象已经被你舍弃了,arr指向了一个新的数组对象,之前的代码中 ...

那么这样写还是错的?
  1. int[] arr=new int[]{1,2};
  2. arr={3,4};
复制代码


作者: Gaara33    时间: 2014-6-12 18:52
↘ふ紫铯幽夢 发表于 2014-6-12 18:39
那么这样写还是错的?

这样写,我试了一下,不行
我也不清楚为什么,规范上问题吧可能。
作者: 格子、    时间: 2014-6-12 19:23
↘ふ紫铯幽夢 发表于 2014-6-12 18:39
那么这样写还是错的?

int[] arr={1,2};是动态初始化了一个数组,并且直接进行了赋值,所以没有错误!!!
arr={1};这句就很搞笑了,arr是个引用类型变量,指向的是数组的内存地址,你却要给它赋值???编译能通过才怪!!!
最后再提一句,数组的所有操作都是基于角标操作的!!!
作者: chang清    时间: 2014-6-12 19:25
我来试试:int[] arr={1,2}; 初始化之后数组大小为2 ,而你这句arr={1}; 在修改arr指向当前引用的数组区域的数组大小。这样肯定是不行的 ,因为 java中数组一旦被初始化大小就固定。
若想改变数组可以这样:arr = new int[]{1}; 这样就更改了数组arr的引用(即数组指针指向的位置改变了)
作者: crazystraw    时间: 2014-6-12 19:30
数组常量只能在初始化操作中使用,你在初始化之后再对数组赋值肯定会报错。
作者: 云的牧羊人    时间: 2014-6-12 19:31
你是想给arr数组再赋值个1还是什么意思?arr数组初始化一次后,已经存在于内存中了,你举得例子中已经规定了lenth为2了,所以肯定不能再追加数据。arr ={1}是想直接给对象赋值?没这种写法把。
作者: liujie445012100    时间: 2014-6-12 20:35
这个代码怎么可能允许?编辑器不知道你数组的角标
作者: alive    时间: 2014-6-12 22:24
数组的长度是固定不变的。。。。
作者: 王广丛    时间: 2014-6-12 22:35
↘ふ紫铯幽夢 发表于 2014-6-12 18:32
那好 请看,这样写就是对的。
下面这样写又是错的:
如何解释?

其实很容易理解,只需要记住常量数组能能应用于数组初始化的工程中。数组的赋值不能一次性用常量数组赋值,要一个个进行赋值
作者: 情深意重    时间: 2014-6-12 22:52
你在定义的时候已经初始化了,你下面一句又一次给赋值,这样很明显回事错误的
作者: 西门吹风    时间: 2014-6-12 22:53
int[] arr={1,2};
arr={1};  //{1}不是数组吧,应该是arr=new int[]{1}
作者: ixiangfeng    时间: 2014-6-12 23:07
arr代表的是一个地址,一个引用,第二句话把一个具体的对象赋值给一个引用,我觉得是这里出的问题吧
作者: HF_Opticalix    时间: 2014-6-12 23:15
一句话 arr是引用类型 只能被对象所指向! 所以arr = {1} 是不允许的
int[] arr={1,2}; 之所以这个可以,是因为右边是一种特殊的初始化方式,相当于new int[]{1,2}
作者: ↘ふ紫铯幽夢    时间: 2014-6-14 13:21
格子、 发表于 2014-6-12 19:23
int[] arr={1,2};是动态初始化了一个数组,并且直接进行了赋值,所以没有错误!!!
arr={1};这句就很搞 ...

那如果想你说的那样 :那请看下面
  1. int[] arr=new int[]{1,2};
  2. arr =new int[]{2};
复制代码
照你说的,这样写是不会通过编译的,但是这样写是对的。
作者: ↘ふ紫铯幽夢    时间: 2014-6-14 13:26
HF_Opticalix 发表于 2014-6-12 23:15
一句话 arr是引用类型 只能被对象所指向! 所以arr = {1} 是不允许的
int[] arr={1,2}; 之所以这个可以,是 ...

既然arr是引用类型,那么arr={1}; {1}也是一个对象,就像你说的相当于new int[]{1}那摩就应该合理啊
作者: ↘ふ紫铯幽夢    时间: 2014-6-14 13:28
ixiangfeng 发表于 2014-6-12 23:07
arr代表的是一个地址,一个引用,第二句话把一个具体的对象赋值给一个引用,我觉得是这里出的问题吧 ...

引用类型的变量就是用来指定对象的啊
作者: ↘ふ紫铯幽夢    时间: 2014-6-14 13:29
西门吹风 发表于 2014-6-12 22:53
int[] arr={1,2};
arr={1};  //{1}不是数组吧,应该是arr=new int[]{1}

那照你说{1,2}也不是数组?

作者: ↘ふ紫铯幽夢    时间: 2014-6-14 13:42
云的牧羊人 发表于 2014-6-12 19:31
你是想给arr数组再赋值个1还是什么意思?arr数组初始化一次后,已经存在于内存中了,你举得例子中已经规定 ...

我的意思是arr是一个引用类型变量,先初始化一个值后,在用arr这个变量去指向一个新的数组,按道理是可以的,把arr={1}这句改成arr=new in[]{1} 是可以的。。
作者: 风飞雪未扬    时间: 2014-6-14 14:37
rr代表的是一个地址,一个引用,第二句话把一个具体的对象赋值给一个引用,是这样的
作者: cain    时间: 2014-6-14 15:12
学习了啊




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