本章学习要点:
1. 了解Java继承特性;
2. 掌握继承实现方法;
3. 掌握override规则;
一、类继承特性
1. 继承定义:使用己存在的类作为新类定义的基础,新类定义中可以增加新的数据或新的方法。 基础类我们称之为父类或基类,新派生的类为子类或派生类;
2. 继承目的:增强类之间的复用性,不用重复操轮子。从而使子类具有父类的功能, 无须再次实现,通常父类作为对多个子类共性的抽象,因而将共性内容(属性和行为)作为父类核心业务;
3. 重写/覆盖: 子类对父类变量或方法的重写,从而使父类的属性或方法被隐藏,用户也可通过super关键字来访问被隐藏的父类方法和属性;
4. 内部实现:父类派生出子类,在子类实例化时,子类的构造方法会调用父类的构造方法构建父类对象,也就是说子类对象中存在其父类的对象引用,若父类还有父类时也同样递归即父类对象嵌套其父类对象。
二、类继承实现
1. 定义父类; public class Base {}
2. 定义子类并通过关键字extends 来实现继承: public class Sub extends Base {}
例如:
// 父类定义
public class BaseClass {
private int value;
public BaseClass() {
System.out.print("BaseClass constructor");
}
public void print() {
System.out.print("BaseClass print : value = " + getValue());
}
public void setValue(int value) {
this.value = value;
}
public int getValue() {
return this.value;
}
}
// 子类定义, 继承于BaseClass
public class SubClass extends BaseClass {
// 子类构造器,在构造子类对象时系统会调用父类的构造器构建一个BaseClass 的隐藏对象
public SubClass() {
super(); // 本行代码可有可无,若没有时系统会默认调用父类的缺省构造器即 父类名();
System.out.print("SubClass Constructor ");
}
// override 父类的方法, 父类方法对外不可见
public void print() {
super.print(); // 通过处方法调用父类被隐藏的print()方法;
System.out.print("SubClass print: value = " + getValue() ); // getValue() 复用了父类定义
}
}
// 测试
public class Demo {
public static void main(String[] args) {
SubClass sub = new SubClass();
sub.setValue(100); // 调用BaseClass 定义的方法,被SubClass重用
sub.print();
}
}
三、Override 原则
重写(Override)也叫覆盖,当父类的方法先法满足子类功能所需时,子类可以重新定义其实现。
重写时需遵循以下原则:
1. 子类中的方法与父类中的方法有相同的返回类型,相同的方法名称,相同的参数列表;
2. 子类中的方法的访问级别不能低于父类中该方法的访问级别;
3. 子类中方法抛出的异常范围不能大于父类中方法抛出的异常的范围;
四、super 关键字
super 有两种用法:
1. 父类构造器
在子类的构造方法中我们可以用super(参数) 来构建父类子对象; 若子类及父类都没有定义构造器时系统会分别为他们定制默认的构造器进行调用;
若类重载构造器时系统将不会被其定制默认的构器器,因而当父类重载构造器且未定义无参的构造器时,子类必须显示调用,此时可通过super来实现;
public class BaseClass {
private int value;
public BaseClass(int value) {
this.value = value;
}
}
public class SubClass {
public SubClass(int value) {
super(value); // SubClass 对象中可认为存在一个super的对象,这时系统内部相当于实现 super = super(value); 构建一个父类对象并将对象赋值给SubClass 中super成员;
}
}
2. 父类对象的引用
在子父方法要调用父类的方法(可见或不可见),可能通过 “super.父类成员” 方法来实现