多态
多态:同一个类型使用不同的的类型的实例来表现不同的操作。
即 父类可以兼容子类的实例 或者 接口接受实现类的实例
//父类兼容子类的实例
Parent p = new Child();
//接口接受实现类的实例
class A implements B;
B b = new A();
实现多态的过程中,父类是无法访问子类新增的属性 和 方法。
使用多态时,调用的方法取决于实例对象的类型。
多态的使用方式:
1、将父类作为参数进行传递,该方式主要用于设计框架的底层结构
2、子类重写父类的方法,使用父类调用子类实例的重写方法
类型转换异常:classCastException
注意点:
子类不能接受父类的实例,由于子类会比父类有更多的属性和方法,因此会导致子类无法在父类的实例中找到子类新增的属性和方法的引用。
由于当前Parent类型引用了Child的实例,因此此次转换相当于 (Child) new Child()
Parent p = new Child();//装箱
Child c = (Child) p; //拆箱
拆箱的父类实例必须是拆箱转换的实例类型,因此拆箱时会对实例类型先进行判断 --------------instanceof-----------
box instanceof Pen;//此处的Pen就是要判断的类型,判断box是不是Pen类型
父类也可以接受子孙类的实例。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
接口(第二种实现多态的方式)
接口是Java中的数据类型,用于对指定的数据内容进行规范设计。
使用目的:
1、实现数据类型的标准化(统一化)
2、接口是面向对象中纯粹的多态性的设计
注意点:
接口不能实例化;
接口中的方法是抽象方法,默认使用public abstract 且必须是公共的
类通过implements实现接口
接口的属性
接口中的属性默认使用public static final 来修饰,且必须使用该类修饰符
接口中的属性都是公共静态的常量
常量必须在声明时进行赋值,且无法对值进行修改。
final
final修饰的属性都将成为常量
final修饰方法将导致方法不能被重写
final修饰类将导致类无法被继承
public static final 修饰符不分先后顺序,一般这样写
如果其父类实现了接口,则也能通过类的子类达到多态的目的。
一个类可以继承父类并对接口进行实现,要求必须先继承父类,再实现接口。
接口可以多实现
一个类可以同时实现多个接口,以逗号分隔,实现多个接口后,每个接口的抽象方法都要实现。
public class A extends B implements C, D{
}
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
抽象类
兼顾了接口和实例类的特点
抽象类不能实例化,并且只能通过继承来使用。
继承的抽象类可以明确提醒子类重写某个方法。
抽象类存在实例方法和抽象方法
public abstract class XX{
//实例方法
public void A(){
}
//抽象方法
public (abstract) void B();
}