JAVA的多态性

多态是面向对象语言中,抽象和继承之后的第三种基本特性,多态依赖于数据抽象和继承。也称做动态绑定、后期绑定或运行时绑定。多态提供给我们操控基类导出的相同接口时,会根据运行时的具体对象信息来调用不同的实现而产生正确的行为。

向上转型(upcasting)

向上转型是一种将导出类引用转换为基类引用的动作,因为从导出类转型为基类,在类继承图中是向上移动的,所以称之为向上转型。向上转型是从一个较为专用的类型转为较为通用的类型,是将接口范围变小,因此向上转型总是很安全的。就好像所有的猫都是动物,所以猫具有一个动物的所有特征和行为,和猫本身独特的行为。将猫转型成动物,一定是成立的,只是会丢失猫的一些独特行为。

/**
 * 向上转型
 */
class Animal {
    public void move(int step) {
        println("Animal move " + step + " step");
    }
}
class Cat extends Animal {
    public void move(int step) {
        println("Cat move " + step + " step");
    }
}
class Dog extends Animal {
    public void move(int step) {
        println("Dog move " + step + " step");
    }
}
public class Begin {
    public static void walk(Animal animal){
        animal.move(1);
    }
    public static void main(String[] args) {
        Cat cat = new Cat();
        walk(cat);

        Dog dog = new Dog();
        walk(dog);
    }
}

在如上代码中有walk(Animal animal)方法,该方法接收一个Animal引用并调用Animal的move方法。当我们传递给他Dog和Cat的引用时,也并不会报错,并且会正确的调用其对象的方法。这有时会让人费解,编译器是如何得知这个引用所代表的具体对象是什么并且调用正确的方法。

绑定

将一个方法调用和一个方法主体关联起来称为绑定。前期绑定是在程序执行前进行的绑定,由编译器和链接程序实现。这是面向过程语言默认的绑定方式,比如C语言就只有一种绑定方式就是前期绑定。 而后期绑定则是解决上述问题的办法,也就是在运行时根据对象的类型来进行绑定,所以又叫动态绑定运行时绑定。而在JAVA中,出了static和final(private属于final)方法,所有方法都是后期绑定。

总结

因此,多态可以让我们使用基类的引用来操作导出类的对象并产生正确的行为。所以我们可以在一些地方使用基类的引用来进行操作,这样不管以后添加了多少新的导出类,对基类原有方法调用的部分都不需要改动而可以正常工作,可以设计出扩展性更强的程序。

原文地址:https://www.cnblogs.com/enhe/p/12141714.html