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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 樊鹏飞 中级黑马   /  2012-10-23 22:13  /  1719 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 樊鹏飞 于 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修饰了  但能通过编译     求解?

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1

查看全部评分

7 个回复

倒序浏览
这个 题 很好证明
final 是 引用 不可变
内容可变
回复 使用道具 举报
本帖最后由 梁枝武 于 2012-10-23 22:35 编辑

代码A中定义的是局部变量 变量被final修饰的话必须显式赋值,且只能赋值一次
代码B中final修饰的是对象,而不是变量,所以编译能通过
回复 使用道具 举报
A中x作为final参数,可以在类中使用,但是不能改变,你return ++x,使x的值发生变化,这和final冲突,所有不行。

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

OK  明白了
回复 使用道具 举报
陈琦 发表于 2012-10-23 23:40
A中,进行 x = x+1; 代码时,x的值肯定发生变化,x 被 final 修饰后,禁止改变值,编译不通过。
B中,o 被  ...

谢谢  懂了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马