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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 傲鸽 中级黑马   /  2013-7-17 01:34  /  1755 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1,
  1. public class Something {
  2.     public int addOne(final int x) {
  3.           return ++x;
  4.     }
  5. }

复制代码
2,
  1. public class Something {
  2.     public static void main(String[] args) {
  3.           Other o = new Other();
  4.           new Something().addOne(o);
  5.     }
  6.     public void addOne(final Other o) {
  7.     o.i++;
  8.     }
  9. }
  10. class Other {
  11.      public int i;
  12. }

复制代码
为什么以上两题的参数同样被修饰成final,1是错的,而2就是对的呢?

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
学习学习!
回复 使用道具 举报
本帖最后由 xscn 于 2013-7-17 15:47 编辑

第一个:int x被修饰成final,意味着x不能在addOne函数中被修改
第二个:对象o被修饰成final。这里修改的是o的成员变量,而在方法体中自增了对象中的属性 i 的值,而对象的引用地址没有被修改,因此不会发生错误。
如果在方法体中写上:o = new Other(); 这时就会报错了。
通俗点讲,final加在对象前,是指该对象不能改变引用,即使是final对象,对象中的变量还是可以更改的。

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

回复 使用道具 举报
第一个形参被final修饰只能被实参传过来对它赋值 你在返回的时候是++i,这样就再次修改了i的值,被final修饰是不能被二次修改的,所以报错。
第二个形参的类型是一个引用类型,它的地址是不能被二次修改的,它的属性可以被二次修改,因为它的属性没被final修饰
    public void addOne(final Other o) {
    o.i++;
    }
o没被修改,只是o.i被修改了

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

回复 使用道具 举报
当final修饰基本类型时,该值不允许改变;当final修饰复合类型时,该引用不可改变。你第一段代码中final修饰的变量是基本类型,所以变量x的值不允许改变,而第二段修饰的是复合类型o,所以o这个变量指向的堆内存地址不允许改变, o.i++; 这段代码只是改变了i的值,而o的值没有变

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

回复 使用道具 举报
    被final修饰的变量只不能被重新赋值。
    但是引用类型的变量的成员变量是可以进行相应的修改的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马