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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐炯 中级黑马   /  2012-5-27 09:54  /  2017 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

例1:int[] arr = new Array[2];//在堆内存中建立数组对象,把他的地址赋给栈内存中变量arr
       arr[1] = 20;//把20赋给堆内存中的arr[1]
       int y = arr[1];//把arr[1]的地址赋给栈内存中的变量y

例2:static int[] arr = new Array[2];//在内存中的方法区建立数组对象,把他的地址赋给栈内存中变量arr
       arr[1] = 20;//把20赋给堆内存中的arr[1]
       int y = arr[1];//把arr[1]的地址赋给栈内存中的变量y

例3:static int[] arr = new Array[2];//在内存中的方法区建立数组对象,把他的地址赋给栈内存中变量arr
       final arr[1] = 20;//把20赋给堆内存中的arr[1]
       int y = arr[1];//把arr[1]的地址赋给栈内存中的变量y

例3中的"final arr[1] = 20",这个20和数组元素arr[1]存放在内存中的哪个位置,常量池?请高手帮忙,不足之处请指正。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

3 个回复

正序浏览
本帖最后由 袁錦泰 于 2012-5-27 21:47 编辑

arr是数组的引用,被final修饰后这个数组引用指向的数组(地址)是不可以改变的,但是被这个引用指向的数组内容是可以改变的,它只是对引用地址进行了固定.
我个人认为这个arr数组引用仍然被存放在栈内存中,因为这里我只是针对引用并没有谈及具体数值,如果你最终得到了正确答案,无论我回答的是否正确,请告知我,谢谢!
回复 使用道具 举报
马超 发表于 2012-5-27 10:06
在Java中声明类、属性和方法时,可使用关键字final来修饰。
final标记的类不能被继承。
final标记的方法不 ...

嗯,final标记的变量(成员变量或局部变量)即成为常量,只能赋值一次,,存放在常量池当中。
arr[1]存放在常量池中,那整个arr数组呢?其它部分是存放在方法区里吗?
回复 使用道具 举报
在Java中声明类、属性和方法时,可使用关键字final来修饰。
final标记的类不能被继承。
final标记的方法不能被子类重写。
final标记的变量(成员变量或局部变量)即成为常量,只能赋值一次,,存放在常量池当中。
方法中定义的内置类只能访问该方法内的final类型的局部变量,用final定义的局部变量相当于是一个常量,它的生命周期超出方法运行的生命周期,将一个形参定义成final也是可以的,这就限定了我们在方法中修改形式参数的值。
public static final共同标记常量时,这个常量就成了全局的常量。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马