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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 于XINCHENG 中级黑马   /  2013-8-30 16:51  /  1494 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 于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; 时,会报错!!!为什么会这样?在堆内存中的对象始终没有改变,是同一个对象!!!谢谢各位!

评分

参与人数 1技术分 +1 收起 理由
黄兴旺 + 1

查看全部评分

8 个回复

倒序浏览
本帖最后由 范龙波 于 2013-8-30 17:05 编辑

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

评分

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

查看全部评分

回复 使用道具 举报
范龙波 发表于 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后,就不会报错,为什么?

回复 使用道具 举报
范龙波 发表于 2013-8-30 17:01
final Fu01 f01 = new Fu01();
这一句你以经声明 01 为final  不可以在赋值
f01 = f02; // 所以这一步肯定 ...

final关键字修饰对象时,只说明了经过final关键字修饰的对象不能指向一个新的对象,我的代码中,没有新的对象存在,为什么还会报错???
回复 使用道具 举报
主要你对fianl这个关键字不理解:
记住以下结论吧(没有为什么):
修饰类时,该类不能在被继承
修饰方法时,该方法不能被子类重写
修饰成员变量时,这个变量一但赋值不能被改变

final Fu01 f01 = new Fu01(); //第一次f01赋值 ,此后在有fu01赋值的语句直接报错
final Fu01 f02 = f01; // 第一次给f02赋值.此后在有fu02赋值的语句直接报错
这两句执行完 , 栈内存: f01,f02 同时指向 堆 内存的实例对象 new Fu01()  
回复 使用道具 举报
范龙波 发表于 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:38
7#
final Fu01 f01 = new Fu01();
      Fu01 f02 = f01;
              f01 = f02;
把上面三句,改成下面三句或许你就明白了:
final int X=10;
       int x=X;
           X=x;// 无法为最终变量X分配值

评分

参与人数 1技术分 +1 收起 理由
薛鹏鹏 + 1

查看全部评分

回复 使用道具 举报
至于f01和f02是不是同一个对象是在运行期才能知道的,但是在编译期无法得知,final类型的变量在后面进行赋值操作,在编译期就被阻止了,而不是看是不是一个对象,编译期没法知道是不是一个对象

评分

参与人数 1技术分 +1 收起 理由
薛鹏鹏 + 1

查看全部评分

回复 使用道具 举报

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

详情参考 如何修改分类

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