黑马程序员技术交流社区

标题: final关键字的问题,想死想不出 [打印本页]

作者: 于XINCHENG    时间: 2013-8-30 16:51
标题: final关键字的问题,想死想不出
本帖最后由 于XINCHENG 于 2013-8-31 16:37 编辑
  1. class Fu01 {
  2.         int i01 = 1;
  3. }
  4. public class Zi01 {
  5.         int i01;
  6.         void test() {
  7.                 System.out.println(i01);
  8.         }
  9.         public static void main(String[] args) {
  10.                 // TODO Auto-generated method stub
  11.                 final Fu01 f01 = new Fu01();
  12.                 Fu01 f02 = f01;
  13.                 f01 = f02; // 这一步会报错!!!
  14.         }
  15. }
复制代码
当我运行f01 = f02; 时,会报错!!!为什么会这样?在堆内存中的对象始终没有改变,是同一个对象!!!谢谢各位!

作者: 范龙波    时间: 2013-8-30 17:01
本帖最后由 范龙波 于 2013-8-30 17:05 编辑

final Fu01 f01 = new Fu01();
这一句你以经声明 01 为final  不可以在赋值
f01 = f02; // 所以这一步肯定会报错!!
比较f1与f2是指向的对象是否为同一个对象 :
f01 == f02;
比较f1与f2指向的对象内容是否相同
f01.equal(f02);

作者: 于XINCHENG    时间: 2013-8-30 17:12
范龙波 发表于 2013-8-30 17:01
final Fu01 f01 = new Fu01();
这一句你以经声明 01 为final  不可以在赋值
f01 = f02; // 所以这一步肯定 ...

你能具体解释一下吗?
final Fu01 f01 = new Fu01();
final Fu01 f02 = f01; // 不会报错

final f01为什么在指向一个对象后,不能再进行赋值?
去掉final后,就不会报错,为什么?


作者: 于XINCHENG    时间: 2013-8-30 17:14
范龙波 发表于 2013-8-30 17:01
final Fu01 f01 = new Fu01();
这一句你以经声明 01 为final  不可以在赋值
f01 = f02; // 所以这一步肯定 ...

final关键字修饰对象时,只说明了经过final关键字修饰的对象不能指向一个新的对象,我的代码中,没有新的对象存在,为什么还会报错???

作者: 范龙波    时间: 2013-8-30 18:03
主要你对fianl这个关键字不理解:
记住以下结论吧(没有为什么):
修饰类时,该类不能在被继承
修饰方法时,该方法不能被子类重写
修饰成员变量时,这个变量一但赋值不能被改变

final Fu01 f01 = new Fu01(); //第一次f01赋值 ,此后在有fu01赋值的语句直接报错
final Fu01 f02 = f01; // 第一次给f02赋值.此后在有fu02赋值的语句直接报错
这两句执行完 , 栈内存: f01,f02 同时指向 堆 内存的实例对象 new Fu01()  
作者: 于XINCHENG    时间: 2013-8-30 18:14
范龙波 发表于 2013-8-30 18:03
主要你对fianl这个关键字不理解:
记住以下结论吧(没有为什么):
修饰类时,该类不能在被继承

谢谢啊,这么一解释我就明白了比如说 int i = 1;
                i = 1;// 就不会报错,全是指向常量池中的1
但是 final int i = 1;
                    i = 1; //就会报错,虽然,内存的指向路径是相同的
所以,可以理解为final 只能进行一次赋值操作

这么一解释我的内存思路就不会被破坏了,愁死我了

作者: 2012    时间: 2013-8-30 19:32
final Fu01 f01 = new Fu01();
      Fu01 f02 = f01;
              f01 = f02;
把上面三句,改成下面三句或许你就明白了:
final int X=10;
       int x=X;
           X=x;// 无法为最终变量X分配值
作者: 夏天那抹蓝╮    时间: 2013-8-31 11:00
至于f01和f02是不是同一个对象是在运行期才能知道的,但是在编译期无法得知,final类型的变量在后面进行赋值操作,在编译期就被阻止了,而不是看是不是一个对象,编译期没法知道是不是一个对象
作者: 薛鹏鹏    时间: 2013-8-31 14:04

如果您的问题已经解决
请更改分类未解决为已解决
保持队形,谢谢合作

详情参考 如何修改分类






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