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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 城市儒侠 中级黑马   /  2013-12-19 19:27  /  1101 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 城市儒侠 于 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修饰了啊。 应该不可以被更改才对啊。

评分

参与人数 1黑马币 +5 收起 理由
乔兵 + 5

查看全部评分

6 个回复

倒序浏览
public void addOne(final Other o)   //  这个 修饰的是 局部变量  只有调用该函数 的时候 这个final 修饰的作用才能起效果  那么在这个函数调用的期间 这个变量是不能修改的    当该函数调用完了 之后 这个变量就弹栈了   那么下次调用 的时候 这个变量又可以赋值其他的数值!~

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
final修饰的是引用变量o,o中存储的是Other类对象的地址值.o被final修饰也就是说o这个变量的值不会变,但是o所指向的对象里的内容是可以改变的
回复 使用道具 举报
不好意思!回复错了!   public void addOne(final Other o) {
o.i++;   这个应该是引用的问题!     final Other o    这个修饰的是 引用地址是不能改变的! 但是里面的值是可以改变的!

评分

参与人数 1黑马币 +1 收起 理由
乔兵 + 1 mark

查看全部评分

回复 使用道具 举报
  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的值是可以改变的

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
final修饰引用类型的时候,是地址不可以改变,但是变量的值是可以改变的。
回复 使用道具 举报
final修饰的类表示表示该类不可被继承,修饰属性表示属性不可更改。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马