【Java语言】继承和多态(一)
继承
继承就是实现代码的复用;简而言之就是重复的代码作为父类(基类或超类),而不同的可以作为子类(派生类)。如果子类想要继承父类的成员就一定需要extends进行修饰(如:(修饰符)+class+子类+extends+父类)。
举一个例子吧:就比如学校吧,学校里面有学生、老师等,【这里就可以分三类:学校类(也可以称为父类),老师类、学生类(这两类就叫做子类)】,他们都是有名字、学号(工号)、都在教室上课、在食堂吃饭等,这些共性就属于父类中的成员,好有就是子类的特性,先说学生类:学生特有的成绩、需要考试、做作业等,老师类:老师特有的工资、需要给同学讲课、准备教学等;把这些信息转成代码就是如下:
那现在子类就创建好了,但是又可能会出现问题啦。比如:子类和父类的成员变量、成员方法出现同名,需要怎么分辨;如果是变量的话该怎么做,方法又该怎么做?
访问父类成员
在子类方法中或子类对象访问成员时,先是访问自己的成员,如果自己没有在访问父类成员,如果再没有就出现编译错误。
子类和父类不存在同名
在子类方法中或子类对象访问成员时,直接访问父类的成员。
子类和父类存在同名
在子类方法中或子类对象访问同名的成员时,子类会优先访问自己的成员(就近原则),但是想要访问父类的同名变量就需要通过关键字super来进行访问(super后面会讲到,在这就不重复)。
super关键字
对于重名的成员来说,在子类中可以访问自己但是不能访问同名的父类,super就满足了子类访问父类的同名成员。 super的作用就是在子类方法中访问父类的成员,所以默认看到super就是访问父类的成员,所以想要访问变量还是方法都是super.访问。举如下例子:
super只能在非静态方法中使用,在子类方法中,访问父类的成员变量和方法。
子类构造方法
子类对象构造时,需要先调用父类构造方法,然后执行子类的构造方法。 意思就是,在调用子类构造方法前必须先执行父类的构造方法,因为子类对象中成员是有两部分组成的,父类继承下来的以及子类新增加的部分,将从父类继承下来的成员构造完整 ,然后再调用子类自己的构造方法,将子类自己新增加的成员初始化完整 。
- 若父类显式定义无参或者默认的构造方法,在子类构造方法第一行默认有隐含的super()调用,即调用父类构造方法
- 如果父类构造方法是带有参数的,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的父类构造方法调用,否则编译失败。//大概意思就是要完整补充子类构造方法中的参数,且第一行需要super(父类的所有参数,无需写参数类型),不然就编译失败。
- 在子类构造方法中,super(...)调用父类构造时,必须是子类构造函数中第一条语句。
- super(...)只能在子类构造方法中出现一次,并且不能和this同时出现
super和this的区别
【相同点】
- 都是Java中的关键字
- 只能在类的非静态方法中使用,用来访问非静态成员方法和字段
- 在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在
【不同点】
- this是当前对象的引用,当前对象即调用实例方法的对象,super相当于是子类对象中从父类继承下来部分成员的引用。(在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性)
- 在构造方法中:this(...)用于调用本类构造方法,super(...)用于调用父类构造方法,两种调用不能同时在构造方法中出现
- 构造方法中一定会存在super(...)的调用,用户没有写编译器也会增加,但是this(...)用户不写则没有
继承中父类和子类代码块的顺序:父类静态代码块,子类静态代码块,父类实例代码块 ,父类构造方法,然后就是子类的实例代码块、构造方法;(且静态代码块只执行一次)
protected关键字
父类中private成员变量虽然在子类中不能直接访问,但是也继承到子类中了
继承方式
继承方式有单继承,多层继承,不同类继承同一个类;在Java中支持多继承(一个类继承多个类) 。
final关键字
final关键可以用来修饰变量、成员方法以及类。只要被final修饰的变量都变成“常量”(就是无法改变);如果修饰的是类,那么这个类就不能被继承;如果修饰的是方法,那么表示该方法不能被重写(重写后面会提及)。