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关键字