- 7.1 组合语法
- 将对象引用置于新类中即可。
- 每个非基本类型的对象都有一个toString()的方法,新建一个类对象的时候,可以重写这个方法。
- 7.2 继承语法
- 得到基类中的所有的域和方法。
- 当创建了一个导出类的对象时,会包含一个基类的子对象,被包装在导出类对象内部。
- 在调用导出类的构造器之前,会默认调用基类的构造器。(“向外”扩散,从父到子,依次调用)
- 调用基类构造器必须是在导出类构造器中第一件要做的事。(super())
- 7.3 代理
- 将一个成员对象置于所要构造的类中(组合),同时新类中暴露了该成员对象的所有方法(继承)。
- 7.4 确保正确清理
- 必须将清理动作置于finally子句中,以预防异常的出现。
- 清理顺序与生成顺序相反,即要求基类元素仍旧存活。
- 名称屏蔽:Java的基类中拥有某个已被多次重载的方法名称,那么在导出类中重新定义该方法名称并不会屏蔽其在基类中的任何版本。(可以用override确保不留心重载而非覆写了该方法)
- 7.5 在组合与继承之间的选择
- 组合技术通常用于想在新类中使用现有类的功能而非它的接口。
- “is-a(是一个)”的关系是用继承来表达的,“has-a(有一个)”是用组合来表达的。
- 7.7 向上转型
- 导出类转成基类。导出类是基类的一个超集,肯定包含基类的所有方法。
- 7.8 final关键字(数据、方法、类)
- 对于编译期常量,编译器可以将该常量值带入任何可能用到它的计算式中,减轻了一些运行时的负担。
- 既是static又是final的域只占据一段不能改变的存储空间,用大写表示,并使用下划线分隔各个单词。
- 对于基本类型,final使数值恒定不变;对于对象引用,无法再指向另一个对象,但是对象自身是可以修改的(自身的属性值可以修改)。这一限制同样适用于数组,数据也是对象。(可以改变数组里的值)
- 不能任何final的基本类型就可以在编译时看到它的值:例如由随机数生成的数值。
- 空白final:Java允许声明为final却没有给定初值。
- final参数:可以读参数,却不能修改参数。
- final方法:确保在继承中使方法行为保持不变,并且不会被覆盖。(过去final可以提高效率,编译器可以将final方法转为内嵌调用,但是现在虚拟机自己可以探测,不需要final进行优化了)。只有在禁止覆盖时,才会使用final。
- 所有private方法都隐式的指定为final的。
- final类中的所有方法都隐式的指定为final。
- 7.9 初始化及类的加载
- 一般来说,类的代码在初次使用时才会加载。通常是指加载发生于创建类的第一个对象时,但是访问static域或者static方法(final staitc的变量也会)时,也会发生加载。(后者不会初始化非static变量,更不会调用构造器)
- 构造器也是static方法。
- 执行顺序:从基类到导出类,依次调用static变量声明->对象中所有的基本类型被设为默认值,对象引用被设为null(这是通过将对象内存设为二进制零值而一举生成的,基类及所有导出类的成员变量都会)->从基类到导出类,依次先调用非static变量声明,再调用构造函数
class Art{ static{ print1("Art static!"); } static int x1 = print1("Art x1"); private int x2 = print1("Art x2"); public final static String x3 = "1"; Art(){ out.println("Art constructor"); } Art(String s){ out.println("Art"); } static int print1(String s){ out.println(s); return 14; } } class Draw extends Art{ static{ out.println("Draw static!"); } static int draw1 = print1("draw1"); private int draw2 = print1("draw2"); public Draw(String s) { // TODO Auto-generated constructor stub System.out.println(s); } } public class test extends Draw{ static{ out.println("Test static"); out.println("Test static1"); } test(){ super("aa"); out.print("test + String"); } public static void main(String[] args) { // TODO Auto-generated method stub out.println(Art.x3); out.println(Art.x1); test test = new test(); } }
输出:
Art static! Art x1 Draw static! draw1 Test static Test static1 1 14 Art x2 Art constructor draw2 aa test + String
相关文章