Java有着众人赞叹的功能,程序代码的重复运用便是其中之一.但是,如果想获得革命性的改变,你得远远超越"复制程序代码,然后改变之"的旧式程序代码的复用途径:组合(Composition)和继承(Inheritance)
toString():每个非基本类别的对象都具备toString(),当编译器希望的到一个String,而你手上却只有那些对象的情况下,这个函数便会被唤起.
测试tips:"为每个class提供main(),不管class是不是public",可以在命令行启动各个main().这样可以使每个class单元测试更为容易.而且在完成单元测试之后,无须删除main();你可以将它留下以待日后再加测试.
super关键字:你可能会在derived class 的函数中(比如是a())调用base class中的某个函数(通常也是a()),这个时候你当然不能直接调用,因为相同的标志符会造成递归.为了解决这个问题,提供了关键字super。他代表超类(superclass),所以你可以如此调用:super.a();
base class的初始化:调用base class构造函数。Java编译器会自动在derived class构造函数中插入对base class默认构造函数的调用动作。但如果你的class不具备default构造函数,或者你想调用带有引数的base class构造函数,你便得运用关键字super,并搭配适当的引数列,明白的写出调用动作,比如说super(i);(注意这和调用一般成员函数的语法有所不同哦)。此外,对base class构造函数的调用,必须是derived class构造函数所做的第一件事(如果你做错了,编译器会提醒你)。
捕捉base构造函数的异常:上面的那个"第一件事"的限制也使得derived class构造函数无法捕捉所有来自base class的异常。有时候这听不方便的。
保持适当的清理:由于Java中不存在析构函数但是有时候我们希望在对象毁灭的时候做些清理动作,这个时候要把代码放到final块中
名称遮蔽(Name hiding):函数不论被定义与某层class或其base class,Java重载(overloading)机制都可以正常运作。当然,使用"和base class一模一样的标记(signature)及返回类别"来复写(override)同名函数,使在寻常不过的事情了,这个也使多态的基础。
关键字final:基本意思是"这是不能被改变的"。基于设计和效率我们可能希望阻止改变。这两个理由十分不同,可能够造成对关键字final的误用。可以使用final的三个地方:data,method,class。
final data:用来告诉编译器某块数据是"固定不变的".用处如下:
1.使用不改变的"编译器常量(compile-time constant)".
2.可以在执行期(run-time)被初始化,而你却不想在改变它。
如果某一数据及时static也是final,他们它拥有一块无法改变的存储空间。
Blank finals:Java允许产生"留白的finals",即允许我们将数据成员申明为final同时可以不给初值,任何情况下,blank finals必须在使用之前进行初始化,编译器会强制保证。不过blank finals比final提供了更多的弹性。因为如此class内的final数据成员便可以在每个对象中有所不同。
Final arguments:将引数申明为final,意味着你无法在此函数中令该引数(一个reference)改指他处。
当基本类型引数申明为final时,表示你可以读取引数所代表的值,但无法改变该值。
final method:使用它的原因有二:
1.锁住这个函数,保证不被derived class 复写(override),这是种设计上的考虑。
2.允许编译器(但此动作不一定产生,编译器此时会有个判断动作)将所有对此函数的调用动作转化为inline(内联)调用。这是种效率上的考虑。
由于以上两点同时会起作用,所有有时候你必须权衡一下值不值得用final method:比如说某个函数很小你想把它转化为内联函数但是此时它会完全失去被override的可能性。所以最好是在某个函数镇的体积很小或者你真的不希望他被复写时,才将他申明为final。
class中的所有private函数自然而然的会是final,因为他们无法被别类取用,更无法被复写。这说明了一点很重要的性质:覆写(overriding)只能够发生在"函数属于base class接口"时。
final classes:原因是你不希望它被继承(要么你是处于保密性考虑要么你是出于设计上的考虑)
请注意,不论class是否为final,数据成员data都可以或者为final,或者不为final.
但final class 中的所有函数也都自然是final的了,因为他们不可能被覆写。
--------------------------------------------------------------------------------