组合
只需将对象引用置于新类中即可。显示的在新类中嵌入某对象,有助于理解部件的组成部分。
继承 extends
Java会自动在导出类的构造器中插入对基类构造器的调用。使用某个现有类,并开发一个他的特殊版本。
构造器的调用顺序:基类->导出类
但默认调用只调用其无参的构造方法,想要调用其带参数的构造法需要用super关键字。
代理
将一个成员对象置于所要构造的类中,同时在新类中暴露该成员对象的所有方法。
结合使用组合和继承
- 确保正确清理:用try-finally处理,一定不能用finalize
- 名称屏蔽:子类重载父类方法时,可以新增重载方法。当子类重载方法与父类方法返回值相异时,编译时就会报错。
- 如果必须向上转型,则继承是必要的,如果不需要,则应当好好考虑自己是否需要继承。
protected 专为继承而生
对类用户而言是private的,对导出类而言是public的
最好实现:private修饰域,用protected方法访问。
这里想到一个编码规范要求"在构造方法内不应调用可被覆写的方法"需要牢记。
final——这是不可改变的
final常量
- 永远不改变的编译时常量
- 运行时被初始化的值,而且你不希望他被改变
final修饰对象,对象可改变,但是对象引用不能改变,只允许一次初始化,可以存在空白final。
final参数
无法在方法中更改参数引用所指向的对象,主要用来向内部匿名类传递数据。
final方法
- 把方法锁定,以防任何继承类修改它的含义,确保继承时保持不变且不会被覆盖。
疑问:父类final private的方法子类能够覆写么?
答:可以同名重写,但这个不是覆写,因为private方法本身对子类不可见,不存在覆写的概念。 - 提高效率,编译时直接将final方法嵌入到代码中,减少了调用开销,但同时会使编出的包体积膨胀。
Java6后就不推荐使用了。
final类
final类的所有方法、域都是final的
初始化及类的加载
- 类的代码在初次使用时才会被加载
- 访问static域或方法时才会被加载
- 加载顺序:
静态域:基类->导出类
构造方法:基类->导出类