对于final本质的补充正如本文所说,final的本质是“不可改变”,所以final class就是不可改变的类。注意,这里说的是“类,不可改变”,而非类的实例不可改变,请不要和上一贴(3)中的不可变类混淆起来。所谓类不可改变,就是指类的行为不能够再由程序改变了,比如增加一个方法或修改一个方法。在Java中,改变一个类的行为的唯一方法是继承它,所以final类不能被继承。与此不同,类的final属性和方法可以被继承。所以final并不暗示不能继承,其本质是不能被改变。因此很容易可以知道,final的属性和方法虽然可以被继承,却不能够贝子类修改,也就是不能被覆盖。

解决方案 »

  1.   

    我来拜神了~~~!~楼主好厉害~!~在CSDN上,偶有个偶象,C++区的111222,他呀,
    也是个低学历的,没有读大学,
    今年也才22岁,是
    “MP3音乐猎手”的作者。
    http://www.111222.cn/111222,年纪没有你大,学历没有你大,家境没有你好,
    好象也是你鄙视的那一种吧,`1不知道,楼主贴过几个共享软件?SHIT~!~
    ==========================================
    楼主呀。有钱人,也鄙视偶一下吧。偶没有读大学,也是22岁,工作三年了。
    MD,现在还是垃圾一个,
    最近还失恋爱了~!http://expert.csdn.net/Expert/TopicView1.asp?id=2999739===========================================
      

  2.   

    To:youngby(诗人)(我~叫黄晨~、烦烦~烦~、烦~)不说说你你还真会洋洋得意以为自己说得有道理人家都服了你了没话说了。一看你就是不懂Java或者自以为懂实际上不懂的人。你拿来一块不锈钢,说:
    “你这个窗帘也不见得比这块不锈钢好么。SHIT~!~”
      

  3.   

    看到楼主和: Sheepy(-[J.2.E.E]-) 的帖子
    受益颇深
    可还有个问题
    就是
    final StringBuffer a=new StringBuffer("immutable");
    final StringBuffer b=new StringBuffer("not immutable");
    这里的final声明的应该是对象a和对象b是不可变得意思吧/
    这个对象的不可变性,是什么意思
    按我的理解,应该是指对象的起始地址不变,通俗点讲,就是对象的门牌号永远不变
    而StringBuffer是设定成对象分配的内存容量是可变的,内容也是可变的
    而所有的对象都没有因为一个final,把对象所占的那块内存设置成只读的
    所以对于对象使用final根本就是无意义的吧!
    请继续讨论
      

  4.   

    又看了楼主的其它帖子,
    我觉得如果对不可变(immutable)类的对象实行final声明
    那一定能达到引用本身的不变,和引用指向的对象不变。
    比如String
      

  5.   

    TO 亡灵:有一点可能需要指正>这很类似==操作符:==操作符只负责引用的“值”相等,至于这个地址所指向的对象内容是否相等,==操作符是不管的。我的理解是==操作符只负责a == b,不负责a.x == b.x;但是如果a == b, a.x可能!= b.x吗?不知道这样的理解对吗?TO  HITZXL(编程要厚道) :
    >所以对于对象使用final根本就是无意义的吧!当然有意义了,匿名内部类应该写过吧?从生命周期来讲,匿名内部类所用到的方法中的局部变量的生命周期延长了
      

  6.   

    对了,看到 Sheepy(-[J.2.E.E]-) 的补充:“final不能子类被继承”,让我联想到另外一个关键字private。来搞脑子,把这水搅混吧。哈哈。private关键字也有这个不能被子类继承的意思。那么问题出来了那么我是不是应该把所有private的方法也都定义成final的呢?
    例如:
    public class A {
      private final methodA() {
        ....
      }
    }
      

  7.   

    private关键字也有这个不能被子类继承的意思。那么问题出来了那么我是不是应该把所有private的方法也都定义成final的呢?
    例如:
    public class A {
      private final methodA() {
        ....
      }
    }-------------------------------------------------------------这还是有区别的,如果只是一个private的话,虽然不能继承,但是子类是可以声明相同方法的。比如:
    public class A {
      private void methodA() {
        ....
      }
    }
    public class B extends A{
      private void methodA() {
        ....
      }
    }但是如果加上final的话,在这样写就不对了。
      

  8.   

    同意 flyforlove(为情飞)的分析!private是oo设计层面上的东西,告诉使用者信息。
    而final则是在编译的层面上的,它是无视那些访问修饰符的。
      

  9.   

    谢谢楼主,你的每个问题我都看了,我是个初学者,获益不少哦.thanks^_^
      

  10.   

    哈哈,alienbat (亡灵法师) 你也可以现身了,很多人在怀念你噢!
      

  11.   

    精彩,很久没看来这样的辩驳了,谢谢大家,“大家”,我是小菜,
    别看我无级无星,我搞计算机编程的年龄也不短了,大家用过apple2的8088没,那时我还没听过OO呢,看来现在的技术是比那个年代复杂多了,我的QQ:27382077,我一般不上CSDN,就只有个号吧了,还是别人叫我申请的也,想交流加我,菜的不加