多态 --Polymorphic
file:///D:/Personal/Documents/My%20Knowledge/temp/bbc22431-1956-4adc-aacd-a349f41be144_4_files/unchecked.png多态的概述:事物存在的多种形态。 Animal a = new Cat();
file:///D:/Personal/Documents/My%20Knowledge/temp/bbc22431-1956-4adc-aacd-a349f41be144_4_files/unchecked.png多态的前提:- a:要有继承关系。(或实现关系)
- b:要有方法重写。(多态的意义所在)
- c:要有父类引用指向子类对象。(多态的核心原理)
file:///D:/Personal/Documents/My%20Knowledge/temp/bbc22431-1956-4adc-aacd-a349f41be144_4_files/unchecked.png多态中成员的访问特点:
- 成员变量:
- 编译看左边,运行也是看左边。 -- 都是父类,成员变量没有重写的概念。
- 成员方法:
- 非静态: 编译看左边,运行看右边。 -- 成员方法存在着重写的概念(动态绑定)。
- 静态: 编译看左边,运行也是看左边。--算不算重写,静态方法与类相关跟着类走。
file:///D:/Personal/Documents/My%20Knowledge/temp/bbc22431-1956-4adc-aacd-a349f41be144_4_files/unchecked.png多态中,父类的引用不能使用子类特有的方法。
解决:向上转型和向下转型。
Animal a = new Cat(); // 隐含着一个向上转型。
Cat c = (Cat) a; // 向下转型
file:///D:/Personal/Documents/My%20Knowledge/temp/bbc22431-1956-4adc-aacd-a349f41be144_4_files/unchecked.png多态的好处和弊端- A:多态的好处
- a:提高了代码的维护性(继承保证)
- b:提高了代码的扩展性(多态保证:父类当作形式参数,可以接收任意子类对象) --开发中最常用到多态的方式
- B:多态的弊端
file:///D:/Personal/Documents/My%20Knowledge/temp/bbc22431-1956-4adc-aacd-a349f41be144_4_files/unchecked.pngClassCastException:
类型转换异常 ---向下转型只能转成对象本来就是的那个类型或者其父类型。
file:///D:/Personal/Documents/My%20Knowledge/temp/bbc22431-1956-4adc-aacd-a349f41be144_4_files/unchecked.pnginstanceof:
判断前面的引用是否为后面的数据类型,用于子类传入形式参数后,向下转型并调用子类特有方法。
if (a instance of Cat) {Cat c = (Cat)a ; ......}
file:///D:/Personal/Documents/My%20Knowledge/temp/bbc22431-1956-4adc-aacd-a349f41be144_4_files/unchecked.png一个完整的有子父关系的内存图(关于变量和方法的调用)
file:///D:/Personal/Documents/My%20Knowledge/temp/bbc22431-1956-4adc-aacd-a349f41be144_4_files/c98c70b2-c100-4ba5-8e42-7de0a11c178e.png
抽象类 --Abstract
file:///D:/Personal/Documents/My%20Knowledge/temp/bbc22431-1956-4adc-aacd-a349f41be144_4_files/unchecked.png抽象类概述file:///D:/Personal/Documents/My%20Knowledge/temp/bbc22431-1956-4adc-aacd-a349f41be144_4_files/unchecked.png抽象类特点- a:抽象类和抽象方法必须用abstract关键字修饰
- abstract class 类名 {}
- public abstract void eat();
- b:抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或者是接口
- c:抽象类不能实例化
- d:抽象类的子类
file:///D:/Personal/Documents/My%20Knowledge/temp/bbc22431-1956-4adc-aacd-a349f41be144_4_files/unchecked.png抽象类的成员特点- a:成员变量:既可以是变量,也可以是常量。(变量的抽象无意义)
- b:构造方法:有 -- 子类访问父类成员之前,保证父类的数据初始化。
- c:成员方法:既可以是抽象的,也可以是非抽象的。
- a:抽象方法 --强制要求子类做的事情(给子类定义规则)
- b:非抽象方法 --供子类继承,提高代码复用性。
抽象类中的面试题file:///D:/Personal/Documents/My%20Knowledge/temp/bbc22431-1956-4adc-aacd-a349f41be144_4_files/unchecked.png一个抽象类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
- 可以,目的是为了不让其他类创建本类对象,交给子类完成(适配器模式)
file:///D:/Personal/Documents/My%20Knowledge/temp/bbc22431-1956-4adc-aacd-a349f41be144_4_files/unchecked.pngabstract不能和哪些关键字共存?
- final final修饰无法创建子类或方法不能被重写,与abstract方法必须被重写冲突。
- static static修饰后可以直接类名.方法名调用,对于abstract方法无意义因为其无方法主体。
- private 方法private后,子类无法访问,更不可能重写。
|
|