当多个类存在继承关系的时候,用父类声明子类的时候称为多态
抽象类,抽象类不能实例化对象知识提供了子类共有的部分,可能存在每个子类需要不同实现的方法,把他们写成一个抽象的,用于给继承本类的子类制定规则,让子类根据规则分别去实现自己不同的功能
多态
多态用父类的引用执行子类的对象
java分成两个阶段编译,运行
编译阶段只能识别等号(=)前面的,不会识别等号后面的
运行阶段从运行开始识别等号后面的 ,对象开始干活
Person person=new Student();
编译阶段识别:person 是Person类的引用
运行阶段:new出来的是student的对象
类型:动态类型,动态绑定,动态加载
多态加载:在编译阶段不能确定具体的对象类型,只有到了运行阶段才能确定谁是真正干活的对象,多态就是典型的动态加载
在编译的时候识别的是引用类型,不识别兑现所以只能判断出Person中的方法,而不能直接调用子类特有的方法
多态的优点
多态可以提高代码的扩展性
例如,给动物喂饭
对象转型
在多态的前提下说向上向下转型
向上转型
有子类类型转换为父类类型就是向上转型
向上转型是自动转型,一定会转型成功
向上转型后只能访问父类中定义的成员
实现多态
向下转型
对象从父类类型转换为子类类型
向下转型是一个显示的过程,相当于强制类型转换,有可能会失败
向下转型后的兑现可以访问子类中独有的成员
instanceof关键字
向下转型有可能会失败所以我们在向下转型之前最好先用instanceof进行检查
使用方法: 对象 instanceof 类或者类的子类
对象是否为后面的类或者类的子类,返回true或者false
父子类出现同名成员
继承下的调用规则
成员变量调用子类的
成员方法调用子类的,子类没有再去调用父类的
多态下的调用规则
成员变量编译的时候能不能访问看父类,运行时候也看父类
成员方法,编译的时候能不能访问看父类,运行的时候看子类
静态成员方法 编译运行都看父类
抽象类
每个子类都有自己的实现方法,父类不能决定它们的实现,于是只把他们在实现的时候需要遵守的规则制定出来,子类可以有自己不同的实现方法,但是他们都要遵守父类所制定的规则;于是父类只在类中声明方法,子类根据方法分别去实现。
抽象方法的特点
抽象方法只有声明没有实现
抽象方法只能定义在抽象类中
非抽象子类在继承抽象父类的时候必须实现父类中所有的抽象接口
抽象类不能直接创建对象,可以通过子类间接创建对象
抽象类不一定有抽象方法,但是有抽象方法的一定是抽象类
继承了抽象类的子类一定要实现抽象方法,如果不实现就只能将自己也变成抽象的
抽象类不能直接创建对象,必须通过子类实现,所以抽象类一定有子类
final,static,private不能和abstract一起用
final修饰的类不能有子类,方法不能重写,但是abstract必须有子类,必须重写
static修饰的方法可以通过类名调用,abstract必须通过子类实现
private修饰的方法不能重写,abstract必须重写
抽象类的使用场景
抽象类中制定规则,要求子类必须实现,约束子类的行为,