1、复用方式:组合、继承、代理

组合是功能上的复用,继承是形式上的复用,代理位于二者之间。

2、创建一个子类对象时,该对象包含了一个基类的子对象。这个子对象与用基类直接创建的对象是一样的。二者的区别在于:后者来自于外部,而子对象被包装在子类对象内部。

3、基类的无参构造器可以隐式地自动被调用,有参构造器必须被显式地调用(通过super关键字)。

子类构造器中调用基类构造器的语句须位于第一句。

注意:如果已经定义了有参数的构造器,则编译器就不会再为该类自动生成一个无参构造器,除非主动为该类提供无参构造器,否则该类不会拥有无参构造器。

4、注意重载(overload)与重写(override)

重写只有在某方法是基类的接口(基类所暴露出的方法)的一部分是才会出现,试图覆盖一个private方法时编译器不会给出错误信息,但是这并不意味着覆盖成功,而仅仅意味着子类有了一个基类接口未提供的新方法。

5、向上转型,见 JAVA继承过程中方法覆盖问题——“=”左右两边分别为父类和子类类型

6、涉及到继承时类的初始化问题,先看下面的代码:

 1 public class Test {
 2     public static void main(String[] args) {
 3         Student student = new Student(16, "李四");
 4     }
 5 }
 6 
 7 class People {
 8     static String spieces = getSpieces();
 9 
10     int age = getAge();
11     String name = getName();
12     
13     private static String getSpieces() {
14         Sop("initialize static field spieces in type People");
15         return "People";
16     }
17     private int getAge() {
18         Sop("initialize nonstatic field age in type People out of constructor");
19         return 15;
20     }
21     private String getName() {
22         Sop("initialize nonstatic field name in type People out of constructor");
23         return "张三";
24     }
25     
26     People(int age, String name){
27         this.age = age;
28         this.name = name;
29         Sop("in People(int age, String name):");
30         Sop(name+":"+age);
31     }
32     
33 }
34 
35 class Student extends People{
36     static String major = getMajor();
37     String collage = getCollage();
38     
39     Student(int age, String name) {
40         super(age, name);
41         Sop("in Student(int age, String name):");
42         Sop(name+":"+age+":"+collage+":"+major);
43     }
44     private String getCollage() {
45         Sop("initialize nonstatic field collage in type Student out of constructor");
46         return "TJU";
47     }
48     private static String getMajor() {
49         Sop("initialize static field major in type Student");
50         return "EE";
51     }
52 }

其输出是:

 1 /*
 2 initialize static field spieces in type People
 3 initialize static field major in type Student
 4 initialize nonstatic field age in type People out of constructor
 5 initialize nonstatic field name in type People out of constructor
 6 in People(int age, String name):
 7 李四:16
 8 initialize nonstatic field collage in type Student out of constructor
 9 in Student(int age, String name):
10 李四:16:TJU:EE
11 */

通过上面的例子可以看出,初始化的顺序依然是和前面JAVA基础:初始化与清理中所说一致,先初始化静态成员、然后创建对象时初始化非静态成员、最后执行构造器。

但是当涉及到继承时,情况稍微复杂些,因为需要同时考虑基类与子类的初始化问题。这时的顺序是这样的:

当要使用子类时(使用其静态成员、创建对象),子类和基类的类文件依次被加载,然后依照从基类到子类的顺序开始初始化静态成员(之所以从基类开始,是因为子类的初始化过程有可能依赖于基类的成员)。

如果要继续创建子类对象,则按照这样的顺序进行初始化:基类非静态成员>>>基类构造器>>>子类非静态成员>>>子类构造器。

7、final关键字

 见JAVA基础:FINAL关键字