java编程思想(读书笔记):6.重复运用classes

六、重复运用classes

两种方法:1.组合2.继承

“为每个class提供main()”的技巧,可以使每个class的单元测试更为容易。

关于继承的小tip:一般为了继承着想,一般将所有数据成员声明为private,将所有函数声明为public,当然并不是这么绝对,针对具体情况作出调整,但确实是个实用原则。

继承初始化的顺序:构建动作会由baseclass“向外”扩散,所以base class会在derived class构造函数取用它之前,先完成自身的初始化动作。此外,对base class构造函数的调用,必须是derived class构造函数所做的第一件事。

关于继承中“清理”的问题:首先执行你的class的所有的特定清理动作(其次序和生成次序相反),这必须“base class元素”尚且存活才行,然后调用base class的“清理”函数。

组合与继承之间的选择:当你想要在新的class中使用既有class的功能,而非其接口,通常可以采用组合技术。实施继承技术时,你会使用某个既有的class,然后开发他的一个特化版本。举例,以“交通工具”来“合成”一部“车”没有任何意义,车子并非包含交通工具,车子是一种交通工具。这种“is--a”(是一个)的关系便以继承来表达,“has--a”(有一个,功能性)则以组合来表达。

关键字protected:代表着“就此class的使用者来说,这是private”。但继承自此一class的derivedclass,或位于同一个package内的其他classes,却可以访问。即,java的protected天生具有“friendly”权限。

继承的优点之一:支持渐进式开发模式。在此模式下,你可以加入新的程序代码,而且绝不会在既有程序代码身上产生bug。

再看组合和继承的选择:尽量使用“组合”。对于“继承”应该谨慎使用,如果确实需要“向上转型”(便于使用多态),那么就用继承。其他情况,慎选。

Final关键字:

1.      final data

可以是永不改变的“编译期常量”,可以是执行期被初始化,而你却不想再改变它。编译期常量,编译器可以将这个常量包进任何一个用到它的计算表达式中,编译期间就能够执行一些计算,减少了执行期的负担。Final用于object reference时,final会让reference保持不变,某个reference一旦被初始化用以代表某个对象以后,便再也不能更改而指向另一个对象,但此时对象本身的内容是可以变动的。

Blank finals:java允许产生所谓的“留白的finals”,就是允许我们将数据成员声明为final,但不给赋初值。给我们了更多的弹性,我们可以在构造函数中通过“引数”为其初始化,这样一来,class中的数据成员便在每个对象中有所不同,但依旧保持着“恒长不变”的特性。

Final arguments:在引数列中声明即可,意味着你无法在此函数中令该引数改指他处。

2.      final methods

原因有二:

1.             锁住这个函数,使derived class无法改变其意义。这是设计上的考量:也许你希望确保某个函数在继承的过程中保持不变,无法被重写。

2.             效率。如果函数被声明为final,等于允许编译器将所有对此函数的调用动作转化为inline(行内)调用。但是,不要过度相信编译器,最好是在某个函数真的体积很小或者你真的不希望它被重写的时候才使用final。class中的private函数自然都是final,因为你无法取用private函数。

 

3.      final classes

当声明某个class为final时,等于声明你并不想继承此一class,也不允许别人这样做。注意,class是否定义为final,不影响数据成员,final data的原则仍然适用。将class定义为final,只是为了杜绝继承。但由于阻止了继承,使得final class中的所有函数也是final,因为没人能够加以重写。

我们努力的目标:让阶层架构中的每个class各自具有特定的用途,而且既不太大(包含太多功能,难以重复使用),也不太小(无法在不加入其他功能的情况下单独使用之)。

你可能感兴趣的:(java,编程,读书笔记,调试,开发模式)