目录
一、继承
Java在面向对象的思想中提出了继承的概念,以便更好的实现代码的共性提取以及代码的复用
1、继承的概念
如图所示,Dog类和Cat类继承了Animal类,其中Dog类和Cat类被称为子类或派生类,Animal类被称为父类或基类或超类,它们的关系也如父子一样,Dog和Cat通过继承Animal来复用Animal中的成员,也就是说子类可以复用父类中成员,子类在实现时只需关心自己新增加的成员即可
Java不支持多继承,也就是一个子类最多只能对应一个父类
2、继承的语法
(1)关键字extends
在Java中通过关键字extends来表示继承关系
举例:
注意:
1. 子类会将父类中的成员变量或者成员方法继承到子类中了
2. 子类继承父类之后,必须要新添加自己特有的成员,体现出与基类的不同,否则就没有必要继承了
(2)父类成员访问
a. 子类访问父类成员变量:遵循就近原则,如果子类自己有则用自己的,没有则用父类的,都没有报错,当子类和父类的成员变量同名时,优先使用子类的
b. 子类访问父类成员方法:与变量访问一致,也遵循就近原则,如果有子类和父类的方法发生重载的情况,选择参数合适的那个方法
但若子类中存在与父类中相同的成员时,那如何在子类中访问父类相同名称的成员呢?我们可以通过super关键字来解决这个问题
(3)super
a.子类方法中访问父类的成员
Java提供了super关键字,该关键字主要作用:在子类方法中访问父类的成员
在子类方法中,如果想要明确访问父类中成员时,借助super关键字即可
【注意事项】
1. 只能在非静态方法中使用(这点和this关键字相同)
2. 在子类方法中,访问父类的成员变量和方法
b.将基类继承下来的成员构造完整
子类对象构造时,需要先调用父类构造方法,然后执行子类的构造方法:
当父类构造方法有参数时,子类构造方法中需要由自己添加带参的super()来将基类继承下来的成员构造完整,然后再调用子类自己的构造方法,将子类自己新增加的成员初始化完整
c.super和this的比较
相同点:
1. 都是Java中的关键字
2. 只能在类的非静态方法中使用,用来访问非静态成员方法和字段
3. 在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在
不同点:
1. this是当前对象的引用,当前对象即调用实例方法的对象,super相当于是子类对象中从父类继承下来部分成 员的引用
2. 在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性
3. 在构造方法中:this(...)用于调用本类构造方法,super(...)用于调用父类构造方法,两种调用不能同时在构造方法中出现
4. 构造方法中一定会存在super(...)的调用,用户没有写编译器也会增加,但是this(...)用户不写则没有
(4)final关键字
final关键字可以用来修饰变量、成员方法以及类
修饰变量:使变量值不能被改变
修饰成员方法:使成员方法无法被重写
修饰类:使类无法被继承
二、组合
和继承类似, 组合也是一种表达类之间关系的方式, 也是能够达到代码重用的效果
组合并没有涉及到特殊的语法 (诸如 extends 这样的关键字), 仅仅是将一个类的实例作为另外一个类的字段
继承表示对象之间是is-a的关系,比如:狗是动物,猫是动物
组合表示对象之间是has-a的关系,比如:汽车有轮胎、发动机、车载系统
三、多态
1、多态的概念
多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态
2、多态实现条件
在java中要实现多态,必须要满足如下几个条件,缺一不可:
1. 必须在继承体系下
2. 子类必须要对父类中方法进行重写
3. 通过父类的引用调用重写的方法
多态体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法
3、代码举例
运行结果:
4、重写
(1)重写的概念
重写(override)是子类对父类方法进行重新编写
(2)重写的规则
a.子类的返回值类型、方法名、参数要求和父类必须相同(返回值类型也可以不同,但是必须是具有父子关系的)
b.父类方法不能被private static final修饰,构造方法不能重写
c.子类的访问权限要大于等于父类的访问权限。例如:如果父类方法被public修饰,则子类中重写该方法就不能声明为 protected(只能是public)
5、向上转型和向下转型
(1)向上转型
a.向上转型:实际就是创建一个子类对象,将其当成父类对象来使用,父类类型引用子类对象
b.语法格式:父类类型 对象名 = new 子类类型()
animal是父类类型,但可以引用一个子类对象,因为是从小范围向大范围的转换
c.使用场景:直接赋值、方法传参、方法返回
(2)向下转型
与向上转型相反,向下转型是由大范围到小范围的转变,因此必须类型强制转换
向下转型用的比较少,而且不安全,万一转换失败,运行时就会抛异常。Java中为了提高向下转型的安全性,引入 了instanceof,如果该表达式为true,则可以安全转换:
6、动态绑定
动态绑定的两个条件:
(1)向上转型
(2)父类的方法在子类中重写