1、复用类的两种方法
(1)只需在新的类中产生现有类的对象。由于新的类是由现有类的对象所组成,所以这种方法称为组合。该方法只是复用了现有程序代码的功能,而非它的形式。
(2)第二种方法则更细致一些,它按照现有类的类型来创建新类。无需改变现有类的形式,采用现有类的形式并在其中添加新代码。
7.1组合语法
1、组合技术:只需将对象引用置于新类中即可。对于非基本类型的对象,必须将其引用置于新的类中,但可以直接定义基本类型数据。
2、每一个非基本类型的对象都有一个toString()方法,而且当编译器需要一个String而你只有一个对象时,该方法便会被调用,可以重写toString()。
3、如果想初始化引用,可以在代码中的下列位置进行
(1)在定义对象的地方。这意味着它们总是能在构造被调用之前被初始化。
(2)在类的构造器中。
(3)就在正要使用这些对象之前,这种方式为惰性初始化。
(4)使用实例化初始化。
7.2继承语法
1、除非已明确指出要从其他类中继承,否则就是隐式地从java的标准根类Object进行继承。
2、即使是一个程序中含有多个类,也只有命令行所调用的那个类的mian()方法会被调用。即使不是public类,也可以执行里面的面方法。
3、为了继承,一般的规则是将所有的数据成员都指定为private,将所有的方法指定为public。
4、在子类的方法中,不能直接调用基类继承而来的方法,因为这样做会产生递归,为解决此问题,java用super关键字表示超类的意思,当前类就是从超类继承来得。
7.2.1初始化基类
1、当创建一个到处类的对象时,该对象包含了一个基类的子对象。这个子对象与你用基类直接创建的对象是一样的。二者的区别在于,后者来自外部,而基类的子对象被包装在导出类对象内部。
2、对基类子对象初始化:在构造器中调用基类构造器来执行初始化,而基类构造器具有执行基类初始化所需要的所有知识和能力。java会自动在到处类的构造器中插入基类构造器的调用。
3、构建过程是从基类“向外”扩散的,所以基类再导出类构造器可以访问它之前,就已经完成了初始化。
4、如果没有默认的基类构造器,或者想调用一个带参数的基类构造器,就必须用关键字super显示地编写调用基类构造器的语句,并且配以适当的参数列表。
5抵用基类构造器必须是你在导出类构造器中要做的第一件事。
7.3代理
1、这是继承和组合之间的中庸之道,因为我们将一个成员对象置于所要构造的类中(就像组合),但与此同时我们在心累中暴露了该成员对象的所有方法(就像继承)
2、我们使用代理拥有更多的控制力,因为我们可以选择只提供在成员对象中的方法的某个子集。
7.4结合使用组合和继承
1、虽然编译器强制你去初始化基类,并且要求你在构造器起始处就要这么做,但是它并不监督你必须将成员对象也初始化,因此在这一点上必须时刻注意。
7.4.1确保正确清理
1、执行类的所有特定的清理动作,其顺序同生成顺序想法
7.4.2名称屏蔽
1、当想要覆写某个方法时,可以选择加@Override注解,在你不留心重载而并非覆写了该方法时,编译器就会生成一条错误信息。
7.5在组合和继承之间选择
1、组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形。
2、在继承的时候,使用现有类。这意味着你再使用一个通用类,并为了某种特殊需要而将其特殊化。
7.6protected关键字
1、监管可以创建protected域,但是最好的方式还是将域保持为private,你应当一直保留“更改底层实现”的权利然后通过protected方法来控制类的继承者的访问权限。
7.7向上转型
7.7.1为什么称为向上转型
1、导出类是基类的一个超集。它可能比基类含有更多的方法,但他必须至少具备基类中所含有的方法。
7.7.2再论组合与集成
1、如果必须向上转型,则继承是必要的。
7.8final关键字
7.8.1final数据
1、有时数据的恒定不变是很有用的
(1)一个永不改变的编译时常量
(2)一个在运行时被初始化的值,而你不希望它被改变
2、一个既是static又是final域只占据一段不能改变的存储空间(编译期常量)。
3、对于基本类型,final使数值恒定不变,而用于对象引用,final使引用恒定不变。
4、既是static又是final的域,将用大写表示,并使用下划线分割各个单词。
5、不能因为某数据是final的就认为在编译时可以知道它的值。因为它可以在运行时再赋值。
6、将final数值定义为静态和非静态的区别:此区别只有当数值在运行时内被初始化才显现,这是因为编译器对编译时数值一视同仁。
7、final参数:指明为final的参数,可以读参数,单不能修改参数。
7.8.2final方法
1、使用原因
(1)把方法锁定,以防任何继承类修改它的含义。
(2)过去建议使用final方法是因为效率(现在不存在了)
2、当基类的某方法为private时,再写一个同名方法,此时并没有覆盖该方法,仅是生成了一个新的方法。
7.8.3final类
1、由于final类禁止继承,所以final类中的所有的方法都隐式指定为final。
7.9初始化及类的加载
1、加载顺序:先基类的static,再子类的static。
2、创建顺序:先子类的构造器,再基类的构造器。