第七章 类复用

一、组合(has-a)

二、继承(is-a)

(1)初始化子类

如果父类的构造方法是带参数的,而且没有无参数的构造方法,那么在子类的构造方法中必须显式地调用父类的构造方法。

如果父类的构造方法是无参数的,那么在子类中写不写都可以,不写的话会隐式地调用。

三、代理

四、组合与继承结合

(1)确保正确的清理

  你并不清楚垃圾收集器合适将会调用,或者它是否被调用。因此你想要某个类清理一些东西,就必须显示地编写一个特殊的方法来做这件事,并确保客户端程序员知晓他们必须调用这个方法。finally

(2)名称屏蔽

  重载机制。@override:防止不想重载时意外重载

五、protected关键字

六、final关键字

(1)数据

  基本类型,不变的是值。引用类型,不变的是引用,值是可以修改的。

(2)修饰类

  不能被继承

  final类中的所有的方法都隐式指定为是final的。

(3)方法

  1.不能被重写

  2.效率,在Java的早期,如果将一个方法指明为final,就是同意编译器将针对该方法的所有调用都转为内嵌调用(不推荐使用、jvm会自己优化

    有final: 没有虚函数表,直接调用,最快
    无final: 普通虚函数,那么正常速度,中间
    有final子类:因为没有虚函数表,需要转换成父类,较慢
    无final子类: 因为虚函数,从虚函数表找父类的getName,最慢

    当然虚函数表的描述是有一定限制的,比如HotSpot VM确实是有为Java类生成vtable的,但是

    其他jvm虚拟机不一定就有,但是处理虚函数的方法基本一致,我们可以统一理解

补:在最近的Java版本中,虚拟机(特别是hotspot技术)可以探测到这些情况,并优化去掉这些效率反而降低的额外的内嵌调用,因此不再需要使用final方法来进行优化了。

  

  final与private

    类中所有的private方法都隐式地指定为是final。由于无法取用private方法,所以也就无法重写。可以对private方法添加final修饰符,但是没有意义。

    混淆:如果你试图重写一个private方法(隐式final),编译期不会报错。

原文地址:https://www.cnblogs.com/jswang/p/7792018.html