继承使用 extends 关键字。
- 子类可以覆盖父类的方法。
- 子类可以继承父类除private以为的所有的成员。
- 构造方法不能被继承。
单继承性:Java 允许一个类仅能继承一个其它类,即一个类只能有一个父类,这个限制被称做单继承性。
super 关键字与 this 类似,this 用来表示当前类的实例,super 用来表示父类。
super 关键字的功能:
- 调用父类中声明为 private 的变量。
- 点取已经覆盖了的方法。
- 作为方法名表示父类构造方法。
通过 super 调用父类的隐藏变量,必须要在父类中声明 getter 方法,因为声明为 private 的数据成员对子类是不可见的。
注意:无论是 super() 还是 this(),都必须放在构造方法的第一行。
注意的是:
- 在构造方法中调用另一个构造方法,调用动作必须置于最起始的位置。
- 不能在构造方法以外的任何方法内调用构造方法。
- 在一个构造方法内只能调用一个构造方法。
方法覆盖的原则:
- 覆盖方法的返回类型、方法名称、参数列表必须与原方法的相同。
- 覆盖方法不能比原方法访问性差(即访问权限不允许缩小)。
- 覆盖方法不能比原方法抛出更多的异常。
- 被覆盖的方法不能是final类型,因为final修饰的方法是无法覆盖的。
- 被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
- 被覆盖的方法不能为static。如果父类中的方法为静态的,而子类中的方法不是静态的,但是两个方法除了这一点外其他都满足覆盖条件,那么会发生编译错误;反之亦然。即使父类和子类中的方法都是静态的,并且满足覆盖条件,但是仍然不会发生覆盖,因为静态方法是在编译的时候把静态方法和类的引用类型进行匹配。
覆盖和重载的不同:
- 方法覆盖要求参数列表必须一致,而方法重载要求参数列表必须不一致。
- 方法覆盖要求返回类型必须一致,方法重载对此没有要求。
- 方法覆盖只能用于子类覆盖父类的方法,方法重载用于同一个类中的所有方法(包括从父类中继承而来的方法)。
- 方法覆盖对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这方面没有任何限制。
- 父类的一个方法只能被子类覆盖一次,而一个方法可以在所有的类中可以被重载多次。
多态是指一个事物有不同的表现形式或形态。
多态存在的三个必要条件:要有继承、要有重写、父类变量引用子类对象。
当使用多态方式调用方法时:
- 首先检查父类中是否有该方法,如果没有,则编译错误;如果有,则检查子类是否覆盖了该方法。
- 如果子类覆盖了该方法,就调用子类的方法,否则调用父类方法。