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