多态
多态的实现可以借由向上转型和动态绑定机制来完成,其中,向上转型实现了将子类对象向上转型为父类类型;而动态绑定机制能识别出对象转型前的类型,从而自动调用该类的方法,两者相辅相成。
当我们在实际开发当中,同一个操作行为针对不同的参数返回不同的实例对象,完成不同的操作结果时,就比较使用多态的操作。
编译时多态:又叫设计时多态,通常是通过方法重载实现的
运行时多态:程序运行时动态决定调用哪个方法
java中的多态大多是指运行时多态
向上转型
必要条件:
-
满足继承关系
-
父类引用指向子类对象
向上转型(也被称为隐式转型、自动转型–》父类引用指向子类实例)
父类引用指向子类实例,可以调用子类重写父类的方法以及父类派生下来的方法,无法调用子类独有方法注意:父类中的静态方法无法被子类重写,所以向上转型之后,只能调用到父类原有的静态方法
小类转型为大类
Animal one = new Cat();
Animal two = new Dog();
绑定机制
绑定就是将一个方法调用同一个方法所在的类连接到一起。Java中存在静态绑定和动态绑定两种。
其中,静态绑定是指在程序运行之前进行绑定(由编译器和链接程序完成的),也叫做前期绑定。动态绑定则是指在程序运行期间由JVM根据对象的类型自动的判断应该调用哪个方法,也叫做后期绑定。
静态绑定的示例:
动态绑定的示例:
向下转型
也被称为强制类型转换
子类引用指向父类对象,此处必须进行强制类型转换,可以调用子类特有的方法
注意:必须满足转换条件才能进行强转,向下转型时,不允许转为非原始类型,即哪来回哪去。
Cat temp = (Cat) one;
instanceof运算符:返回true/false 能判断是否满足向下转型的转换条件
例如:one instanceof Cat返回true;two instanceof Dog返回false
关于类型转换的应用问题
关于向下转型已出现的错误总结
关于静态方法(static)是属于类共享的,这种方法只能被子类继承使用,不能被重写
抽象类
不允许实例化,可以通过向上转型,指向子类实例
用abstract修饰,可以:
public abstract class Animal{}
或
abstract public class Animal{}
应用场景:某个父类只是知道其子类应该包含怎么样的方法,但无法准确知道这些子类如何实现这些方法,比如父类定义了一个动物要吃东西的方法,但具体怎么吃,每种动物有不同的方法
抽象方法
抽象方法:不允许包含方法体{};子类中需要重写父类的抽象方法(子类也是抽象类的时候可以不重写父类的抽象方法)
包含抽象方法的类一定是抽象类,但抽象类中可以不包含抽象方法
static,final,private三者都不能与abstract并存(private只能在当前类中访问,final方法不允许被子类重写,static也不允许在子类中被重写)