java中的继承用extends关键字来实现,被继承的类叫做超类、父类、基类,实现继承的类称为子类、派生类。
子类是一种特殊的父类,因此可以看作父类是大类,子类是小类。
extends实际上是拓展的意思,而父类和子类的关系实际上用拓展来解释似乎更加的恰当,子类在父类功能的基础上增加新的功能。
在继承中,除开父类的构造器以外,子类几乎可以继承父类所有的功能和属性。
每个类最多只能有一个直接的父类,可以有无限多个间接父类,就像人一样,只能有一个亲生父亲。
若一个类定义的时候没有显示定义直接父类,则默认继承java.lang.Object,他是所有类的父类,因此所有的java对象都可以调用java.lang.Object的实例方法。
父类引用可以指向子类对象,即声明一个父类型的变量可以实例化为子类的对象,这也是java多态性的一个重要的实现方式。除此之外,方法的重载也是多态性的实现方式之一。
需要注意的是,重写方法和被重写的方法必须同时都是类方法或者同时都不是类方法。
继承中还有一个很重要的概念是重写,对于子类重写过的方法,使用时究竟使用重写前的版本还是重写后的版本,取决于对象的类型而不是引用的类型。
重写的时候,子类方法会覆盖父类的方法,父类private方法不可被重写。
有的时候,当子类定义了与父类同名的属性时,也会覆盖父类的属性。正常情况下,子类定义的方法、子类属性直接访问该属性时,都会默认访问覆盖后的方法和属性而无法访问到被覆盖的方法和属性。但是在子类定义的实例方法中可以通过super来访问父类被覆盖的方法和属性。
如果子类中没有和父类同名的属性,那么访问的时候不需要用super,可以直接访问。和this一样,super也不能出现static方法中。
继承的时候不继承父类的构造器,如果在子类中一定要用的话,也可以通过super来调用。而即使不显示的调用父类构造器,系统也会默认在子类构造器执行体的第一行调用父类构造器一次,只不过是调用父类的无参构造器。
super调用和this调用不会同时出现。
子类构造器调用父类构造器有几种情况:
1.super显示调用,系统会根据super里的实参列表选择调用父类的哪个构造器。
2.子类构造器执行体的第一行用了this调用本类重载的构造器,那么在执行调用的构造器的第一行会调用父类的构造器。
3.子类中既没有this调用也没有super调用,系统会默认在子类构造器执行体的第一行调用父类的无参构造。
创建任何对象总是从该类继承树的最顶层构造开始执行,然后依次向下,最后才是本类。