黑马程序员技术交流社区

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

作者: 樊鹏飞    时间: 2012-10-23 22:13
标题: 关于final关键字的问题
本帖最后由 樊鹏飞 于 2012-10-23 23:59 编辑

源代码A:
  1. public class Test
  2. {
  3.         public int add(final int x){
  4.                 return ++x;
  5.         }
  6. }
复制代码
源代码B:
  1. public class Test
  2. {
  3.         public static void main(String[] args){
  4.                 Other o = new Other();
  5.                 new Test().add(o);
  6.         }
  7.         public void add(final Other o){
  8.                 o.i++;
  9.         }
  10. }

  11. class Other
  12. {
  13.         public int i;
  14. }
复制代码
代码A中:无法通过编译 出错信息为:不能指定最终参数x,   因为x用final修饰了,而代码B中也用final修饰了  但能通过编译     求解?
作者: 葬天    时间: 2012-10-23 22:20
这个 题 很好证明
final 是 引用 不可变
内容可变

作者: 梁枝武    时间: 2012-10-23 22:34
本帖最后由 梁枝武 于 2012-10-23 22:35 编辑

代码A中定义的是局部变量 变量被final修饰的话必须显式赋值,且只能赋值一次
代码B中final修饰的是对象,而不是变量,所以编译能通过
作者: 新立    时间: 2012-10-23 22:54
A中x作为final参数,可以在类中使用,但是不能改变,你return ++x,使x的值发生变化,这和final冲突,所有不行。

B中o的值是没有改变的
作者: 林志进    时间: 2012-10-23 23:39
在这之前,应该了解final的特性。final可以修饰类,方法和变量,其修饰的目的都是希望被修饰的事物不被改变。
在源代码A中:x参数变量已经被修饰为final了,那么++x函数相当于 x=x+1;相当于x被重新赋值了,所以编译通不过。
而源代码B中:o.i++; o这个变量的引用指向的还是同一个对象,只是这个对象的成员属性i自增了而已。final修饰是这个对象变量,而不是其成员变量
作者: 陈琦    时间: 2012-10-23 23:40
A中,进行 x = x+1; 代码时,x的值肯定发生变化,x 被 final 修饰后,禁止改变值,编译不通过。
B中,o 被 final 修饰后,就永久的指向 other 对象,不管你 other 里的值怎么变化, o 的指向是不会变的。
作者: 樊鹏飞    时间: 2012-10-23 23:57
林志进 发表于 2012-10-23 23:39
在这之前,应该了解final的特性。final可以修饰类,方法和变量,其修饰的目的都是希望被修饰的事物不被改变 ...

OK  明白了
作者: 樊鹏飞    时间: 2012-10-23 23:58
陈琦 发表于 2012-10-23 23:40
A中,进行 x = x+1; 代码时,x的值肯定发生变化,x 被 final 修饰后,禁止改变值,编译不通过。
B中,o 被  ...

谢谢  懂了




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