黑马程序员技术交流社区

标题: final的问题 [打印本页]

作者: 城市儒侠    时间: 2013-12-19 19:27
标题: final的问题
本帖最后由 城市儒侠 于 2013-12-19 20:46 编辑
  1. public class Test {
  2. public static void main(String[] args) {
  3. Other o = new Other();
  4. new Test().addOne(o);
  5. System.out.println(o.i);
  6. }

  7. public void addOne(final Other o) {
  8. o.i++;
  9. }
  10. }

  11. class Other {
  12. public int i;
  13. }
复制代码
为什么结果是1呢?

命名被final修饰了啊。 应该不可以被更改才对啊。


作者: Faner    时间: 2013-12-19 19:36
public void addOne(final Other o)   //  这个 修饰的是 局部变量  只有调用该函数 的时候 这个final 修饰的作用才能起效果  那么在这个函数调用的期间 这个变量是不能修改的    当该函数调用完了 之后 这个变量就弹栈了   那么下次调用 的时候 这个变量又可以赋值其他的数值!~
作者: 张利星    时间: 2013-12-19 19:43
final修饰的是引用变量o,o中存储的是Other类对象的地址值.o被final修饰也就是说o这个变量的值不会变,但是o所指向的对象里的内容是可以改变的
作者: Faner    时间: 2013-12-19 19:52
不好意思!回复错了!   public void addOne(final Other o) {
o.i++;   这个应该是引用的问题!     final Other o    这个修饰的是 引用地址是不能改变的! 但是里面的值是可以改变的!
作者: 绕世界流浪丶    时间: 2013-12-19 20:27
  1. public class Test {
  2. public static void main(String[] args) {
  3. Other o = new Other();
  4. new Test().addOne(o);
  5. System.out.println(o.i);
  6. }

  7. public void addOne(final Other o) {
  8. o.i++;
  9. }
  10. }

  11. class Other {
  12. public int i;
  13. }
复制代码

你这个只是other o 被final修饰了
但是o的调用的值是不被修饰的
o.i++;
i的值是可以改变的
作者: kun1990    时间: 2013-12-19 21:07
final修饰引用类型的时候,是地址不可以改变,但是变量的值是可以改变的。
作者: 青出于蓝    时间: 2013-12-20 11:57
final修饰的类表示表示该类不可被继承,修饰属性表示属性不可更改。




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