6.1 组合语法
6.2 继承语法
如果基类有不带参数的构造函数,且子类构造函数中没有显式调用父类的带参数的构造函数,则子类的构造函数中会自动调用父类不带参数的构造函数
如果基类没有不带参数的构造函数,则子类的构造函数中需使用super显示的调用父类的构造函数
6.3 结合使用组合和继承
6.4 在组合与继承之间选择
组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形。即,在新类中嵌入某个对象,让其实现所需要的功能,但心累的用户看到的只是为心累所定义的接口,而非所嵌入对象的接口,为取得此效果,需要在新类中嵌入一个现有类的private对象。
有时,允许类的用户直接访问新类中的组合成分是极具意义的;也就是说,将成员对象声明为public。如果成员对象自身隐藏了具体实现,那么这种做法也是安全的。当用户能够了解到你正在组装一组部件时,会使得端口更加易于理解。
6.5 protected关键字
protected指明“就类用户而言,这是private的,但对于任何继承于此类的导出类或其他任何位于同一个包内的类来说,它却是可以访问的。
6.6 增量开发
6.7 向上转型
继承还是组合,一个最清晰的判断方法就是问一问自己是否需要从新类向基类进行向上转型。
6.8 final关键字
在Java中,编译时常量必须是基本数据类型,并且以关键字final表示。在对这个常量进行定义的时候,必须对其进行赋值。
一个既是static又是final的字段只占据一段不能改变的存储空间。
当对对象的引用而不是基本类型运用final时,起含义会有一点令人迷惑。对于基本类型,final使数值恒定不变;而用于对象引用,final使引用恒定不变。一旦引用被初始化指向一个对象,就无法再把它改为指向另一个对象。然而,对象其自身却是可以被修改的,Java并未提供使任何对象恒定不变的途径。
1.空白final
指被声明为final但又未给定初值的字段。
必须在字段的定义处或者每个构造器中用表达式对final进行赋值,这正是final字段在使用前总是被初始化的原因所在。
2.final参数
意味着你无法在方法中更改参数引用所指向的对象。
3.final方法
第一个原因是把方法锁定,以防止任何继承类修改它的含义。这是出于设计的考虑:想确保在继承中是方法行为保持不变,并且不会被覆盖。
第二个原因是效率。如果将一个方法指明为final,就是同意编译器将针对该方法的所有调用都转为内嵌调用(内联)。Java编译器能够明智地抉择是否对final方法执行内嵌动作。
注:类中所有的private方法都隐式地指明为是final的。
当将某个类的整体定义为final时,就表明你不打算继承该类,而且也不允许别人这样做。由于final类禁止继承,所以final类中所有方法都隐式指定为final的,因为无法覆盖它们。
6.9 初始化及类的加载