多态:
一种事物的多种形态|多种表现形式
行为的多态
一个行为的不同的实现方式
多态的前提:
类的继承|接口的实现
多态的最终体现:
父类的引用指向子类的对象
注意: 如果多态想要有意义,需要配合方法的重写,多态才有意义
多态调用:
会调用子类中重写的方法
多态的实现效果:
配合方法的重写,当父类引用指向不同的子类对象,同一个方法具有不同的实现方式-->行为多态
多态调用成员的特点:
父类引用调用
成员变量:
编译运行看父类|左边|类型
成员方法:
编译看父类|左边|类型
运行找子类|右边|对象
注意: 多态是行为的多态
多态如果不配合方法的重写没有意义
父类引用对子类新增内容不可见
例题:
做题四大原则:
一、继承链:自己没有找父
A
|
B
/ \
C D
二、 编译看类型、确定方法,运行找对象
三、就近最优原则
四、父类引用对子类新增方法不可见
引用数据类型 : 转型
类型的大小 : 看继承关系|实现关系
父类>子类
向上转型 : 自动类型提升
Person p = new Student(); --> 多态
多态调用: 对子类新增内容不可见
向下转型 : 强制类型转换
Student s = (Student)p;
通过s引用调用Student类型所有的内容
ClassCastException 类型转换异常
引用强转类型的时候,没有转为指向的子类对象类型,转为了其他子类类型,出现的异常
预防出出现类型转换异常->instanceof 运算符
引用 instanceof 类型:
判断前面的引用是否指向后面类型的对象或者后面类型子类的对象,是->true 不是->false
抽象的abstract
抽象类: 被abstract修饰的类
抽象方法: 被abstract修饰的方法
没有方法体
存在与抽象类中
开发部门:
Develop 开发部 work()
java攻城狮 work(){"服务器端开发"}
web程序猿 work(){"客户端开发"}
抽象类的特点:
1.抽象类不能实例化
2.抽象类可以定义任意内容(属性,功能(抽象的方法,具体的方法))
3.抽象方法必须要求被重写
4.抽象类使用: 通过具体子类对象使用
具体子类: 重写所有的抽象方法 + 按需新增
抽象子类: 按需重写抽象方法 + 按需新增
5.一个抽象方法一旦被重写,可以不再被重写,根据需求决定
6.abstract不能与private,final,static,native 一起使用
7.抽象类可以实现多态
接口 :
接口可以理解为是一个特殊的抽象类
功能的集合
引用数据类型
接口可以帮助定义规范
解耦-->降低耦合度
类是单继承,接口多实现的
定义 : interface 定义接口 组成: jdk7及之前: 公共的静态的常量 public static final--> 修饰符可以任意省略 公共的抽象的方法 public abstract --> 修饰符可以任意省略 jdk8及之后:
jdk8中新增: 1.静态方法 : 可以定义方法体 使用: 通过接口名使用 2.默认方法 : 可以定义方法体 显示的被default修饰 使用: 通过实现类对象使用
使用:
1.接口不能实例化
2.接口需要通过实现类的对象使用
3.父类需要通过子类继承 extends -->父类中的成员,子类继承父类有权可以直接使用
接口需要通过实现类去实现 implements --> 因为接口中几乎都是抽象方法没有方法体,需要实现类自己实现方法体,所有叫做实现
接口的实现与类的继承很像,都拥有了父类的成员使用权,或者拥有接口中定义的功能,但是一个侧重点在拿过来就用,一个侧重点在拿过来要实现才能用
4. 接口的使用:
具体的实现类 : 重写所有的冲向方法 + 按需新增
抽象的实现类 : 按需重写 + 按需新增
5.接口可以多实现,类只能单继承
6.如果一个类同时继承父类实现接口,要求先继承后实现
注意:
1.父类与接口无法完全相互代替,如果可以建议使用接口,因为接口可以多实现非常灵活
2.类与类之间只能继承
类与接口之间,只能是类实现接口
类与类之间只能单继承
类与接口之间可以多实现
接口与接口之间,可以多继承
3.接口可以实现多态 接口引用指向实现类对象