黑马程序员技术交流社区

标题: 关于final的 [打印本页]

作者: 傲鸽    时间: 2013-7-17 01:34
标题: 关于final的
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就是对的呢?
作者: chensc    时间: 2013-7-17 05:44
学习学习!
作者: xscn    时间: 2013-7-17 15:43
本帖最后由 xscn 于 2013-7-17 15:47 编辑

第一个:int x被修饰成final,意味着x不能在addOne函数中被修改
第二个:对象o被修饰成final。这里修改的是o的成员变量,而在方法体中自增了对象中的属性 i 的值,而对象的引用地址没有被修改,因此不会发生错误。
如果在方法体中写上:o = new Other(); 这时就会报错了。
通俗点讲,final加在对象前,是指该对象不能改变引用,即使是final对象,对象中的变量还是可以更改的。
作者: a767175432    时间: 2013-7-17 15:47
第一个形参被final修饰只能被实参传过来对它赋值 你在返回的时候是++i,这样就再次修改了i的值,被final修饰是不能被二次修改的,所以报错。
第二个形参的类型是一个引用类型,它的地址是不能被二次修改的,它的属性可以被二次修改,因为它的属性没被final修饰
    public void addOne(final Other o) {
    o.i++;
    }
o没被修改,只是o.i被修改了
作者: 于世德    时间: 2013-7-17 16:42
当final修饰基本类型时,该值不允许改变;当final修饰复合类型时,该引用不可改变。你第一段代码中final修饰的变量是基本类型,所以变量x的值不允许改变,而第二段修饰的是复合类型o,所以o这个变量指向的堆内存地址不允许改变, o.i++; 这段代码只是改变了i的值,而o的值没有变
作者: 赵太云    时间: 2013-7-17 18:46
    被final修饰的变量只不能被重新赋值。
    但是引用类型的变量的成员变量是可以进行相应的修改的。




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