简介:继承在面向对象中是很重要的,它使整个程序架构很有弹性,在程序中复用一些已经完善的类不仅可以减少软件的发展周期,也可以提高软件的可维护性和可拓展性。
继承的基本思想就是基于某个父类的拓展,制定新的子类,子类可以继承父类原有的属性和方法,也是可以增加父类原先不具备的属性和方法,或者重写父类的一些方法(Java中用extends关键字来标识两个类的继承关系)
例1:
class Test(){
public Test(){//构造方法
}
protected void doSometing(){//成员方法
}
protected TestdoIt(){//方法返回值类型为Test类型
ruturn new Test();
}
}
class Test2(){
public Test2(){
super();//调用父类的构造方法
super.doSometing();//调用父类的成员方法
}
public void doSometingnew(){//新增方法
}
public void doSometing(){//重写父类的方法
}
protected Test2 doIt(){//重写父类方法,返回值类型为Test2类型
return new Test2();
}
}
注意:1、构造方法和成员方法的区别在于构造方法是初始化一个类的对象时调用的,它是没有返回值的,而且名字必须和类的名字一样;成员方法是类的对象主动调用的,使用点操作符,是由返回值的,构造方法是对象的生命特征,成员方法是对象的具体行为,构造方法只有在建立对象时由系统调用。
2、子类是无法调用父类的private的方法的,子类可以用super的关键字来调用父类的成员方法,也是可以重写父类的成员方法的实现内容,更改成员方法的存储权限(但是重写是不能降低方法的修饰权限的范围的)
例2:
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();//实例化子类对象
}
}
以上的代码运行结果是:
结果表明在实例化子类的时候首先要实例化父类对象,然后再实例化子类对象,调用构造方法的顺序也是首先顶级父类,然后是上一级父类最后是子类,子类构造方法访问父类的构造方法之前,父类已经完成了实例化的操作。
附:1、在实例化子类对象的时候,父类的无参构造方法将被自动调用,有参构造方法不能被自动调用,只能依赖super关键字来显式的调用父类的构造方法。(关于此项的具体介绍详见我的另一篇文章“子类调用父类的有参和无参的构造方法”)
2、如果使用finalize()方法对对象进行清理,需要确保子类的finalize()方法的最后一个动作是调用父类的finalize()方法,以保证来及回收对象占用内存是,对象的所有部分都能被正常终止。