从实现方法上看,java实现多态的三种方式:重写和重载,接口,抽象类和抽象方法
重写和重载
重写是指在不改变父类函数的参数,返回的前提下,修改函数的实现。
重载可以修改父类函数的参数,方法体以及返回,但不改变父类函数的函数名。
抽象方法与抽象类
抽象类中不一定包含抽象方法,但包含抽象方法的类一定是抽象类,
抽象方法仅仅是声明,而没有具体的方法实现,
构造函数和类函数(static)不能设置为抽象函数
抽象类不能实例化,需要继承并实现抽象方法后才能实例化
接口
接口是一系列抽象方法的集合,强调一下,是抽象方法。平时编程的时候,接口函数前的修饰符是没有abstract修饰符的,但是会被隐式地指定为抽象方法。接口中的方法默认是public abstract方法,不能是其他修饰符。
接口无法被实例化,但可以被实现。
一个实现接口的类必须实现接口中的所有方法,除非这个类是抽象类。
Java中子类继承只能继承一个父类,却可以实现多个接口中的方法。
从本质上来看,编译器实现多态的方式有两种:编译时多态和运行时多态。
编译时多态
重载一定是编译时多态,因为重载函数的返回类型和参数都不同,所以在编译时,编译器就知道执行的是哪一个重载函数;
重写不一定是编译时多态,只有当对象引用的是本类的对象时是编译多态。在这种情况下,编译器是可以确定,调用的方法肯定是子类中重写后的方法。
运行时多态
除了以上提到的两种情况,其他的多态都是运行时多态。拿继承举个例子,一个父类对象引用了子类的对象,那么在运行时,编译器会先去查找子类中有没有该方法的实现,要是找到了,就调用子类中的方法。如果子类没有该方法的实现,那么就会调用父类的方法。