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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王红潮 中级黑马   /  2012-8-27 00:09  /  1686 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. {
  2. public static void main(String[] args)
  3. {
  4. int[] arr = {3,4,2,1,5,32};
  5. arr = {4,3,2};
  6. }
  7. }
复制代码
为什么会提示错误,但是当改成 arr=null; 时就没错了?

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 加油!

查看全部评分

7 个回复

倒序浏览
编译的时候编译器不知道params 的类型,所以才报错。如果这种写法正确,看看下面的写法:
Object[] params;
params = {"1","2","3"};//这个地方有歧义,Object类型还是String类型
回复 使用道具 举报
int[] arr = {3,4,2,1,5,32};已经初始化此时arr指向 {3,4,2,1,5,32}这个数组,此时arr应像一个指针指向的应给是一个地址

点评

请改为实名!  发表于 2012-8-27 08:09
回复 使用道具 举报

要明白数组是怎么进内存空间的,
首先,栈内存中加载主函数,这时主函数中有一数组名arr,然后再堆内存中开辟一空间,存储数组{3,4,2,1,5,32},数组元素首地址设其为0x0089,这时将首地址告诉栈内存中的arr,然后arr指向堆内存中的数组;而当arr=(4,3,2}时,在堆内存中再开辟一块空间存储数组{4,3,2};这数组元素的首地址另设为0x0034,这时本该把这个地址告诉栈内存中的arr,可arr在之前已经指向上面那一数组了,不能再指向下面的数组,所以编译会失败。如图

MR}{D2]S2NON}Q~8AWZ@U%A.jpg (22.41 KB, 下载次数: 67)

MR}{D2]S2NON}Q~8AWZ@U%A.jpg

点评

请改为实名!  发表于 2012-8-27 08:08
回复 使用道具 举报
哥们,你犯了一个常识的错误。数组名字其实是一段连续内存的首地址,你把几个数字赋值给首地址当然会报错了,都没有空间来装它们。arr=null表明指针可以指向空的,也就是不指向任何地方,在java中是可以的。

评分

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

查看全部评分

回复 使用道具 举报
qiaojiu9 发表于 2012-8-27 00:35
int[] arr = {3,4,2,1,5,32};已经初始化此时arr指向 {3,4,2,1,5,32}这个数组,此时arr应像一个指针指向的 ...

正在申请呢
回复 使用道具 举报
史龙贤 发表于 2012-8-27 01:51
哥们,你犯了一个常识的错误。数组名字其实是一段连续内存的首地址,你把几个数字赋值给首地址当然会报错了 ...

有些明白了,谢谢啊!
回复 使用道具 举报
史龙贤 黑马帝 2012-8-27 21:59:44
8#
有些明白了,那还有些不明白的地方呢,帮我人喜欢帮到底,再提问吧,彻底明白才行啊!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马