Java -5 继承和多态(子类继承父类、方法的覆盖和变量的隐藏)
子类继承父类
- “继承‘是面向对象最显著的一个特性。
- 一个子类继承父类,这个子类就会自动获得了父类中定义的成员变量和成员方法,同时,这个子类也可以定义新的成员变量和成员方法。
- 父类又称为超类或基类,子类又称为派生类。通过子类继承父类,使得复用父类的代码变得非常容易,能够大大缩短开发周期,降低开发费用。
下图用UML图体现类之间的继承关系,图中子类用空心三角箭头指向父类。
Java语言只支持单继承,不支持多继承,B类继承A类的语法如下:
继承的语法机制:
- Java虚拟机在装载一个子类之前,必须先装载它的父类。
- 因为一个子类对象肯定要拥有父类对象的属性,所以在一个子类对象数据中是包含一个父类对象数据的。那么在创建初始化一个子类对象时,就必须要先创建初始化一个父类对象。所以在调用子类构造方法时,肯定会先调用父类的构造方法,以初始化这个子类对象里的父类对象。
- 父类的构造方法是不能被子类继承的,但是子类的构造方法中可以调用、也必须调用父类的构造方法。
- 如果在子类的构造方法中需要显式调用父类的构造方法,那么就要在子类构造方法中的第一行,使用语句“super(实参列表)”来调用父类的构造方法。
- 如果在子类的构造方法中没有显式调用父类的构造方法,则编译器会自动在子类构造方法中的第一行,添加调用父类无参构造方法的语句“super()”,如果此时父类没有定义无参的构造方法,则会出现编译错误。
方法的覆盖和变量的隐藏
- 如果一个子类对继承自父类的某个方法的实现“不满意” ,子类可以重新实现这个方法。这种语法机制称为“方法的覆盖”(Override)
- 与方法的覆盖 类似的语法机制是 变量的隐藏 。所谓变量的隐藏 是指:在子类中可以定义父类中以及定义的成员变量,或者说,可以定义和父类成员变量同名的成员变量,此时子类的成员变量同名的成员变量隐藏了父类的成员变量。
方法的覆盖需要注意以下几点:
- 子类重新实现的方法必须和父类中被覆盖的方法具有完全一致的:方法名、参数列表和放回值类型,否则就不能称为方法的覆盖。
- 在子类的方法中,可以通过语句“super.方法名”,来显式调用父类中被覆盖的方法。
- 子类不能覆盖父类中用“static”、“private”或者“final" 修饰符修饰的方法。
- 只有当一个子类能够访问父类的某个方法时,父类的这个方法才能被子类覆盖。
案例