final类的几个疑问:
1.为什么要有final类?final类的作用无非就是不让继承,但是为什么不让继承呢?
有人回答:因为安全原因,我们认为这个东西不能覆盖,但是我想了很久都没想出来这个跟安全的什么关系.因此找了不少资料.
有人这样说:我好好的一个类里面的一个方法,比如Math里面的方法,本来结果是正确的,结果你覆盖了,把结果搞错了.
但是我觉得我要在这里纠正一个概念的问题,到底什么结果才是错误呢,一般来说我们会认为我调用某一个方法返回的结果和预想的结果不一样,那么我们认为这个方法错误了,但是保不准就有这样的特殊业务需求,比如说π值,我就不取3.14,我取3你能说我这个结果是错误的吗?当然不能.我要继承一个类,然后覆盖父类的某个方法,覆盖就是为了多态,为了改变,我当然知道我这个方法需要返回什么样的结果.而且这样也并未影响父类方法的执行结果,如果你需要原来的服务依然可以去调用父类的方法,请注意,你覆盖方法永远只能改变你调用某个方法的结果,你无法影响到父类方法的执行结果.
好,还有人说,如果父类的某个方法(比如:A方法)调用了父类的另一个方法呢(比如:B方法),那么当你子类覆盖了B方法,却影响到你调用父类的A方法的结果了,我开始以为问题解决了,但是仔细推敲一下,这个答案依然占不住脚,怎么说,如果你因为不让子类覆盖某一个方法而影响另一个方法,那么你首先声明该方法时,就应该声明为私有,然后提供一个相同功能的公开的方法,这只能说明你设计有问题.
还有人说:继承破坏封装,我始终没理解到底怎么算破坏封装,破坏之后又有什么样的影响,他在什么地方破坏了封装.请各位赐教!!
2.wait方法为什么要写在object类里面?
如果按照面向对象的思想,那么这个设计就是错误的,但是java的设计者绝不会犯这种低级错误,因为如果按照wait方法的作用来说,
1.wait方法只能写在synchronized方法里面,不然他会直接抛异常.(如果没记错的话,写在synchronized代码块里面也会直接抛异常).
2.当线程执行到xx.wait()时,他会交出改对象的锁,然后进入等待池等待,如果有调用该对象的notice方法,那么唤醒该对象的线程对象时,他会进入锁池去等待拿锁.如果拿到锁之后,继续运行,但是我仔细一想就出问题了,为什么该方法会放在一个跟线程毫不相干的对象里面呢,因为如果object对象没有该方法,那么我完全可以写一个静态方法在Thread类里面,当线程执行到该代码时,他交锁(这里虽然没对象,但是大家想想,总之每个线程执行到这句代码时,都会等待,那么是否是同一个对象也不重要了),然后等待池等待,然后....结束.
请各位赐教!!!

解决方案 »

  1.   

    第一个问题,Final类是一种设计思路的体现, 原作者认为该类不应该再被继承或扩展, 这是很正常的思路问题, 就好象你自己写代码也会有选择的设置一些方法为private, 一些数据不可被访问一样。
    第二个问题其实挺有意思的, 关键在于锁和对象是关联的,而不是和线程关联的, 一个锁必须是某一个对象的锁, 比如你如果用线程内的静态方法去代替object.wait(), 那么请问你等待的是那个对象的锁?线程可以访问多个不同对象的锁, 所以不要把锁和线程关联起来。
      

  2.   

    第一个问题涉及到了设计模式。
    根据封闭-开放原则:软件实体(类)等应该可以扩展,但是不可以修改。
    所以就有final类的出现。