Java的一个引人注意的特性就是代码的重复使用或者再生。
Java有两种方法来实现:合成和继承。合成看起来比较简单,也就是声明一个新的类型,其中包括了几个现在以后的类型。用汽车的例子来说明就是避免“重复制造轮子”。至于“轮子”应该什么时候被造出来?可以是在准备生产汽车之前就造(在定义处)、可以边造汽车边造(构建器内)、可以早完汽车然后等到要用轮子的时候(在使用之前)。
继承的实现很简单:“extends”。虽然简单,不过还是要想几个问题,这样一串的东西,先初始化哪个?其实写个简单的程序就可以验证了(基类的初始化完成之后才开始衍生类的初始化,其实简单想想也应该是这样的):
1 class Art {
2 Art() {
3 System.out.println("Art constructor");
4 }
5 }
6 class Drawing extends Art {
7 Drawing() {
8 System.out.println("Drawing constructor");
9 }
10 }
11 public class test extends Drawing {
12 test() {
13 System.out.println("Cartoon constructor");
14 }
15 public static void main(String[] args) {
16 test t = new test();
17 }
18 }
当然在有需要的时候可以复合使用继承和合成。但是到底是应该选择继承还是合成?继承有一个特性就是“上溯造型”,如果用不到这个特性就用合成吧。还有一个判断的方法就是看是否使用已有类的接口?有一个关键字应该算是专门为继承准备的吧:“protected”。
什么是“上溯造型”?就是说“新类型是现有类型的一种”。这样的说法在解释一些“为什么函数参数不同却能正确访问”的问题了。
在继承里面最后引出来的一个东西是“final”。如果一个类被“final”修饰,那这个类就不能被继承(也仅此而已,不要想太多了)。当然“final”的用法远不止这些,例如如果一个“int”之类的值被“final”修饰,那么它的值是不能被改变的。如果一个“句柄”被就修饰,那么它就不能指向别的对象了(其实这个和“int”是一样的,只是怕混淆所以单独说一下,感觉和c++里面的const多么相似)。如果方法中的一个参数被“final”修饰,那么在这个方法内参数的值是不允许被修改的(即使是“int”)。如果用“final”来修饰一个方法(所有的“private”修饰的方法默认是“final”的),那么它的效果和c++里面的“inline”一样了,还有就是给这个方法“上了一把锁”,防止其他的继承类修改它。“final”用的时候还是要谨慎的!!
-----------------------
个人理解,欢迎拍砖。