一、抽象类及抽象方法
1.认识抽象类及抽象方法
应用场景:当一个方法必须在父类中出现,但是这个方法又不好实现,就把该方法变成抽象方法,交给非抽象的子类去实现
实例:
//抽象类 public abstract class 类名{//抽象方法public abstract void method(); }
抽象方法交给非抽象的子类去实现(重写)
2.抽象类及抽象方法的深入
抽象类中可以有构造方法、静态方法、成员方法、抽象方法
抽象类中可以没有抽象方法,但是毫无意义
如果父类是抽象类,子类不一定实现父类的抽象方法,子类如果是抽象类,可以不实现父类的抽象方法
抽象类可以有构造方法
不能使用new关键字来创建抽象类对象,创建的是匿名内部类的对象
如图:
二、接口
1.认识接口
- 含义:特殊的抽象类
- 注意:
- JDK1.8以前,接口中只能有静态常量和抽象方法
- JDK1.8开始,接口中添加了静态方法和默认方法
- 作用:定制标准
- 抽象类与接口的区别
- 抽象类:成员变量、静态变量、静态常量、成员方法、静态方法
- 接口:静态常量、静态方法(JDK1.8)、默认方法(JDK1.8)
2.接口的深入
类 - 接口之间的关系:
类 - 类 :单继承
类 - 接口:多实现
接口 - 接口:多继承
一个类可以实现多个接口
一个接口不可以实现多个接口,因为接口与接口的关系是多继承
接口里面的方法不一定都是抽象的,JDK1.8之前:接口中只能有静态常量和抽象方法,JDK1.8开始:接口中可以使用默认方法和静态方法
接口解决了类的单继承问题,因为类与类是单继承,类与接口是多实现
一个类可以继承一个类并同时实现多个接口
接口不可以new对象,接口是特殊的抽象类,但是本质还是抽象类,抽象类是不可以new对象的,接口也是不能new对象,new出来的匿名类内部类的对象
三、多态
1.类的多态
理解:子类对象指向父类引用(父类引用中存储的是子类对象在堆中开辟的地址)
需求:老师骑着自行车上班
分析:老师类、自行车类
需求迭代:自行车 -> 小汽车
步骤:创建Car,继承Vehicles,重写open()、close()
设计原则:前人总结的经验,告诉我们什么不该做
设计模式:前人总结的经验,告诉我们具体怎么做
OCP原则:
O - Open - 在需求升级时,对于创建类是欢迎的
(因为创建类对于原来代码的影响几乎为0)
C - Close - 在需求升级时,对于改动原有类是拒绝的
(因为原有类之间的关系是趋于稳定状态,如果改动原有类,
很有可能打破这种平衡,导致bug的出现)
P - Principle - 原则
2.接口的多态
理解:实现类对象指向接口的引用(接口的引用中存储的是实现类对象在堆中开辟的地址)
需求:模拟电脑连接外部设备
分析:
接口 – IUSB
鼠标 – 实现IUSB
硬盘 – 实现IUSB
电脑 – 连接IUSB接口
四、对象转型
引用数据类型的转型
- 向上转型(自动转型):子类类型 转 父类类型
- 向下转型(强制转型):父类类型 转 子类类型
1.向上转型
- 向上转型后,可以调用父类非私有化的成员属性
- 向上转型后,可以调用父类非私有化的成员方法
- 向上转型后,不可以调用子类的成员属性和成员方法
- 向上转型后,可以调用子类重写父类的方法
- 注意:向上转型就是多态
- 多态的优缺点:
- 优点:需求升级时不违反OCP原则
- 缺点:不可以调用子类独有的成员属性和成员方法
2.向下转型
注意:向下转型是有风险的
错误示范:
Animal animal = new Animal(); Dog dog = (Dog) animal; dog.eat();
会报:ClassCastException - 类型转型异常
原因:父类类型不能直接转换为子类类型经验:向下转型之前,必须向上转型
Animal animal = new Dog();if(animal instanceof Dog){//判断引用animal中所指向的对象是否是Dog类型Dog dog = (Dog) animal;dog.eat();