继承
Java使用关键字extends来实现继承
继承的概念
◼ 在OOP中,允许用现有的类来定义一个新类,这个新类就叫做原有类的
子类(派生类),原有类称为父类(基类、超类) ◼ Java类只支持单继承(一个类只能有一个直接父类),且都是公有继承
重要问题
1.子类除了继承父亲的属性和操作外,还可以定义自己的属性和操作,也可以对父亲的操作进行重写
2.子类并不继承父亲的构造函数
方法重写
在子类中创建一个与父亲相同名称,相同参数列表,相同返回值的方法,只是方法中的实现不同,以实现不同于父类的功能,这种方法被称之为重写。
方法重写规则
◼ 子类方法的名称、参数表、返回类型必须与与被重写的方法相同
◼ 重写方法的访问权限不能比父类的权限低(public>protected>default>private)★
◼ 重写方法一定不能抛出新的非运行时异常或者比被重写方法声明更加宽泛的非运行时异常。
◼ private方法、final方法、static方法不能被重写(下页示例)
◼ 构造函数不能被重写
父类
1 | public class animal { |
子类
1 | public class cat extends animal |
关键字super
◼ 用法1:super可被子类用来引用其直接父类
super.父类成员变量或方法 (非private类型)
◼ 用法2:子类调用直接父类构造函数super( [参数列表] ),super尽在子类的构造方法中使用,而且必须是第一个可执行语句
父类
1 | package animals; |
子类
1 | public class cat extends animal |
super衍生的问题
子类对象在创建和初始化的时候,需要在子类构造函数中首先调用父类的构造函数,这种调用要么是显示调用,要么是隐式自动调用
结果:报错
解释:子类函数在创建和初始化的时候,需要在子类的额构造函数里面调用父类的构造函数,这种调用要么是显示调用(可以通过super),要么是隐式调用。
没有显式调用的话,系统将会自动的调用默认的父类的构造函数(没有参数的),但是如果用户定义了父类的构造函数而且有参数,父类的无参的构造函数就会缺失。
解决方法:在父类中补上缺失的构造函数
再次强调
◼ 子类对象在创建时,不仅要用调用本类的构造函数,而且还要调用父
类相应的构造函数,且父类构造函数首先调用
◼ 因此,子类构造函数如果不显示地通过super调用父类构造函数,则
系统将自动隐式调用默认的父类构造函数(带0个参数的)
◼ 在这种情况下,如果没有缺省的父类构造函数,
多态
◼ 什么是多态?
一个对象只有一个类型(是在声明时给它的)。但是,如果该对象能
指向其他不同类型的对象(通常是子类),那么这个对象就是多态性的。
多态主要体现继承过程中的动态调用问题,具体来说,可以用“一个
对外接口,多个内在实现方法”表示
父类
1 | package animal; |
子类
1 | package animal; |
1 | package animal; |
测试类
1 | package animal; |
输出
1 | 喜欢吃鱼 |
多态实现的三个条件
◼ 继承:
◼ 在多态中必须存在有继承关系的子类和父类
◼ 重写:
◼ 子类对父类方法进行重新定义,在调用这些方法时会调用子类的方法
◼ 向上转型:
◼ 父类引用指向子类对象
多态程序的注意点
◼ 多态情况下,子类中存在跟父类同名的成员变量时,访问的是父类的成员变量 (变量不属于重写)
◼ 多态情况下,子类中存在跟父类同名的非静态方法时,调用的是子类中的方法 (重写的方法)
◼ 多态情况下,子类中存在跟父类同名的静态方法时,访问的是父类中的方法
(静态方法不能重写)
◼ 多态情况下,访问不到子类中特有的成员 (需要向下转换)
向上转型的意义
向下转型使得能够访问到子类特有的方法和成员
本文作者: jiangyuhao
本文链接: http://example.com/2022/03/09/%E7%BB%A7%E6%89%BF%E5%92%8C%E5%A4%9A%E6%80%81/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!