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