继承基础

inherite继承
1.为什么要继承
(1)代码的复用
延续父类的一些特性
(2)代码的扩展
扩展父类没有的一些特性
(3)表示is-a的关系

2.如何实现继承?
在声明一个类时取继承其父类。
语法格式:
【修饰符】class 子类名 extends 父类名

子类(Subclass):又称为派生类
父类(SuperClass):又称为基类、超类
extends:扩展

3.继承的要求
(1)子类在继承父类时,一定会在子类的构造器中调用父类的构造器。默认情况下,是调用父类的无参构造。格式为:super()
(2)如果父类没有无参构造,那么子类可以显式的调用父类的有参构造。格式为super(实参列表)

4.继承的特点
(1)子类不会继承父类的构造器,但是子类的构造器中一定会调用父类的构造器。
(2)子类可以继承父类的所有方法、属性,如果父类中关于这个方法和属性是私有的话,在子类中不能直接使用。
(3)子类可以扩展父类没有的属性和方法。
(4)如果父类的方法的方法体不适用于子类,那么我们的子类可以选择进行重写。
(5)Java中继承有单继承的限制,不支持多重继承
如何理解:一个子类只能有一个直接的父类,换句话说,不能同时继承好几个类;举例:
class Manager extends Employee{}//正确
class Manager extends Employee,Person{}//错误
(6)Java支持多层继承
如何理解:父类还可以有父类,然后父类的父类也是我的父类
class Manager extends Employee{}
class Employee extends Person{}
Manager把Person也称为父类
为了区别,Manager把Employee称为直接父类,把Person称为间接父类。
(7)Java中一个父类可以同时有很多个子类
class Employee extends Person{}
class Student extends Person{}
Person同时有两个子类Employee,Student

选择生成哪些构造器?
(1)没有什么特殊情况,一般无参构造都保留
(2)至于其他有参构造,我们可以灵活的自己选择
标准:别人调用我们的构造器的时候,有多种方式来创建对象。

方法的重载Overload
在同一个类中,出现了方法名称相同,形参列表不同的两个或多个方法构成了方法的重载,和返回值无关。

方法的重写Override
在子类继承父类时,如果父类的某个方法体实现不适用于子类,那么子类可以选择进行重写。

方法重写的要求:
(1)子类重写的方法的方法名必须与父类被重写的方法的方法名相同。
(2)子类重写的方法的形参列表必须与父类被重写的方法的形参列表相同。
(3)子类重写的方法的返回值类型与被重写的父类的方法的返回值类型关系
如果返回值类型是void或基本数据类型(8种),要求必须相同
如果返回值类型是引用数据类型,可以<=的关系,子类重写的方法的返回值类型<=父类被重写方法的返回值类型;规定:子类的范围<父类的范围
(4)子类重写的方法的权限修饰 >= 父类被重写的方法的权限修饰
public > protected > 缺省 > private
暂时可以手动加@Override可以辅助我们进行检查

this:
意思:当前对象
(1)构造器中:正在创建的那个对象
(2)方法中:当前对象,表示调用这个方法的对象
用法:
(1)this.属性
当成员变量(属性)与局部变量重名时,在成员变量(属性)的前面加this。
(2)this.方法
当需要调用当前对象的其他成员方法时,可以使用,也可以省略
(3)this()或this(实参列表)
访问本类的其他构造器,必须在构造器的首行
this()访问本类的无参构造
this(实参列表)访问本类的有参构造

super:
意思:父类的
要求或者前提:通过super访问的属性,方法,构造器必须是在子类中可见的。
不能是private,如果是跨包,也不能是缺省

(1)super.属性(很少用)
什么情况必用?
当子类有与父类重名的属性时,如果要访问父类的属性,可以加super.
如果子类没有与父类重名的属性时,那么不需要加super.,也可以访问。

结论:看方法中的这个变量到底是哪个变量,原则就是就近原则
如果变量的前面既没有this,也没有super,先从局部变量开始找,如果局部变量没有,再从本类的属性列表中找,如果本类没有,再从父类的属性列表中找。
如果变量的前面有this,先从本类的属性列表中找,如果本类没有,再从父类的属性列表中找。
如果变量的前面有super,先从父类的属性列表中找。
(2)super.方法
什么情况必用?
当在子类中需要调用父类“被重写”的方法时,需要加super。
如果子类没有重写该方法,可以省略super.。
(3)super()或super(实参列表)
super()或super(实参列表)也必须在子类构造器的首行
super()调用父类的无参构造,要求父类必须有无参构造
super(实参列表)调用父类的有参构造,要求父类必须有有参构造
注意:不论子类中有参构造方法或者无参构造方法下,都可以调用父类的有参构造方法和无参构造方法。

面向对象的基本特征:封装性、继承性、多态性
面向对象的特征:封装性、继承性、多态性、抽象性
多态性:polymorphism
方法的多种形态
1.方法的重载和重写
方法的重载:同一个功能在同一个类中,有多种形式
方法的重写:同一个功能在父子类中,多个子类中多种形式
2.对象的多态性
对象有两种形态:(1)编译时类型(2)运行时类型
编译时按照父类编译,运行时执行的是子类重写的方法体。
前提条件:(1)类的继承关系(2)多态引用(3)方法的重写

多态的应用:
1.多态数组
数组的元素类型是父类的类型
数组的元素对象是子类的对象
2.多态参数
形参是父类的类型
实参是子类的对象

基本数据类型的转换:
1.自动类型转换
byte,short,char->int->long->float->double
boolean不参与

2.强制类型转换
byte,short,char<-int<-long<-float<-double
强制类型转换:有风险,损失精度或溢出

引用数据类型,编译时转型
(1)向上转型upcasting
当出现多态引用时,子类的对象就会向上转型成父类的类型
一旦向上转型,通过父类的变量,就无法调用子类的“扩展”方法。

(2)向下转型:需要强制类型转换downcasting
当把存在父类的变量中的对象,重新赋值给子类的变量时,就需要向下转型。
向下转型有风险,可能会发生ClassCastException:类型转换异常
如何避免向下转型的异常?
instanceof
对象 instanceof 类型:判断这个对象是否属于这个类型

原文地址:https://www.cnblogs.com/1185937986-jili/p/12860391.html