##1、类的继承
###1.1
继承的基本思想是基于某个父类的的扩展,制定出一个新的子类,子类可以继承父类的原有的属性和方法,也可以增加原来父类所不具备的属性和方法,或者直接重写父类中的某些方法。
例如:平行四边形是特殊的四边形,可以说平行四边形类继承了四边形类,这是平行四边形类将所有四边形具有的属性和方法都保留下来,并基于四边形类扩展了一些新的平行四边形类特有的属性和方法。
在Java中使用extends关键字来标识两个类的继承关系;
例1;在项目中分别创建Test类和Test2类,在Test2类中编写成员方法doSomething()和doIt(),使Test2类继承Test类,重写父类的两个方法和构造方法,并新增doSomethingnew()方法。其中Test2类的构造方法中使用super关键字调用父类的构造方法和成员方法等;
class Test {
public Test() { // 构造方法
// SomeSentence
}
protected void doSomething() { // 成员方法
// SomeSentence
}
protected Test doIt() { // 方法返回值类型为Test类型
return new Test();
}
}
class Test2 extends Test { // 继承父类
public Test2() { // 构造方法
super(); // 调用父类构造方法
super.doSomething(); // 调用父类成员方法
}
public void doSomethingnew() { // 新增方法
// SomeSentence
}
public void doSomething() { // 重写父类方法
// SomeNewSentence
}
protected Test2 doIt() { // 重写父类方法,方法返回值类型为Test2类型
return new Test2();
}
}
###1.2
在子类中可以连同初始化父类构造方法来完成子类的初始化操作,既可以在子类的构造的方法中使用super()语句中调用父类的构造的方法,也可以在子类的中使用super关键字调用父类的成员方法等,但是子类没有权限调用父类中被修饰为private的方法,只可以调用父类中修饰为public或protected的成员方法。
在继承中有一种特殊的重写方式,子类与父类的成员方法返回值、 方法名称、参数类型及个数完全相同,唯一不同的是方法实现内容,这种特殊的重写方式被称为重构;
###1.3
当重写父类方法时,修改方法的修饰权限只能从小的范围到大的范围改变;例如,父类中的doSomething()方法的修饰权限为protected,继承后子类中的方法doSomething()的修饰权限只能修改为public,不能修改为private。
###1.4
在实例化子类对象时,Java编译器会在子类的构造方法中自动调用父类的无参构造器,为了验证这个理论,来看下面的实例;
10.2;在项目中创建Subroutine(子程序)类和两个父类,分别为Parent和SubParent。这3个类的继承关系是Subroutine类继承SubParent类,而SubParent类继承Parent类,分别在这3个类的构造方法中输出构造方法名称,然后创建Subroutine类的实例对象,继承机制将使该类的父类对象自动初始化。
class Parent { // 父类
Parent() {
System.out.println("调用父类的parent()构造方法");
}
}
class SubParent extends Parent { // 继承Parent类
SubParent() {
System.out.println("调用子类的SubParent()构造方法");
}
}
public class Subroutine extends SubParent { // 继承SubParent类
Subroutine() {
System.out.println("调用子类的Subroutine()构造方法");
}
public static void main(String[] args) {
Subroutine s = new Subroutine(); // 实例化子类对象
}
}
在Eclipse中运行本实例,运行结果
从本实例的运行效果可以看出,在实例化子类对象时它相应调用了父类的构造方法。在结果中可以看到调用构造方法的顺序,首先是顶级父类,让后是上一级的父类,最后是子类,也就是说,实例化子类对象时首先要实例化父类对象,然后再实例化子类对象,所以在子类构造方法访问父类的构造的方法之前,父类已经完成实例化操作。
##注意:
在实例化子类对象时,父类无参构造方法将被自动调用,但有参构造方法并不能被自动调用,只能依赖于super关键字显示地调用父类的构造方法。
##技巧:
如果使用finalize()方法对对象进行清理,需要确保子类的finalize()方法的最后一个动作是调用父类的finalize()方法,以保证当垃圾回收对象占用内存时,对象的所有部分都能被正常终止。