一、组合(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),编译期不会报错。