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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wyasln 中级黑马   /  2015-11-27 10:22  /  927 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

final可以修饰变量、方法和类
final修饰变量的时候看解释就是赋值后就不可以改变其值了
例如final int num = 1,后面的程序中就不可以再对num赋值,这个好理解
final修饰引用类型的变量的时候,比如final int[] aa = {1,2,3,5};并不是说aa就不能变了,aa[i]一样可以赋值,是这样理解吗

6 个回复

倒序浏览
      1、final int[] aa只是说aa数组这个不能再指向其他数组对象,但它指向的数组的内容是可以变的!
      2、final使得被修饰的变量"不变",但是由于对象型变量的本质是“引用”,使得“不变”也有了两种含义:引用本身的不变,和引用指向的对象不变。
回复 使用道具 举报
唉, 这样的第一次见到,,aa[i]  应该还可以赋值吧
回复 使用道具 举报
本帖最后由 hansnowqiang 于 2015-11-27 11:56 编辑

我说说我的理解:
修饰变量时:final int num =1 ;
在栈中有一个num—>通过一个地址值—>方法区常亮池中的“1”,用final修饰了num就是指这个地址值不能被修改了。
修饰String等类型时是一样的只不过是通过地址值指向了堆中new出来的“内容”这个地址值不能被修改了
修饰引用类型时:final int[] arr = {1,2,3,4}
同理:
在栈中开辟了一个区域有了 int[] arr —>通过一个地址值—>指向了在堆中的{1,2,3,4}这个数组。你可以通过这地址对堆中的这个数组的arr[x]做修改,但是你不能改变这个地址值。
回复 使用道具 举报
这个问题是不在于final 而在于基本数据类型与引用型数据类型的实质。基本数据类型引用的数值,当然再被final修饰后不能再赋值;而引用型引用实质是地址,不是数据本身,在被final修饰后,地址值是被固定的,不能在指向其他数组,而数值却可以更改。
回复 使用道具 举报
修饰变量, 变为常量,   修饰类不能被继承, 修饰方法 不能被重写
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马