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