多态

多态

多态是指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。多态也称作动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。

通俗地讲,只通过父类就能够引用不同的子类,这就是多态,我们只有在运行的时候才会知道引用变量所指向的具体实例对象。

向上转型

要理解多态必须要明白什么是"向上转型",比如,一段代码如下,Dog 类是 Animal 类的子类:

Animal a = new Animal();  //a是父类的引用指向的是本类的对象

Animal b = new Dog(); //b是父类的引用指向的是子类的对象

在这里,可以认为由于 Dog 继承于 Animal,所以 Dog 可以自动向上转型为 Animal,所以 b 是可以指向 Dog 实例对象的。

注:不能使用一个子类的引用去指向父类的对象。

如果定义了一个指向子类对象的父类引用类型,那么它除了能够引用父类中定义的所有属性和方法外,还可以使用子类强大的功能。但是对于只存在于子类的方法和属性就不能获取

class Animal{
    //父类方法
    public void bark(){
        System.out.println("动物叫!");
    }
}
class Dog extends Animal{
    //子类重写父类的bark方法
    public void bark(){
        System.out.println("汪、汪、汪!");
    }
    //子类自己的方法
    public void dogType(){
        System.out.println("这是什么品种的狗?");
    }
}

public class Test{
    public static void main(String[] args){
       Animal a = new Animal();
       Animal b = new Dog();
       Dog d = new Dog();

       a.bark();
       b.bark();
       //编译不通过
       //b.dogType();
       d.bark();
       d.dogType();
    }
}

运行结果如下:
多态_第1张图片
在这里,由于 b 是父类的引用,指向子类的对象,因此不能获取子类的方法(dogType()方法),同时当调用 bark()方法时,由于子类重写了父类的 bark()方法,所以调用子类中的 bark()方法。

因此,向上转型,在运行时,会遗忘子类对象中与父类对象中不同的方法,也会覆盖与父类中相同的方法——重写。(方法名,参数都相同)

多态的实现条件

Java 实现多态有三个必要条件:继承、重写和向上转型(即父类引用指向子类对象)。

只有满足上述三个条件,才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为。

多态的实现方式

Java 中多态的实现方式:继承父类进行方法重写,抽象类和抽象方法,接口实现

你可能感兴趣的:(Java编程语言基础)