面向对象的特征——多态

多态的含义,简单来说就是一类事物在不同时刻表现出不同的状态。

就像是:

小猫和小狗都属于动物类,小猫吃鱼,小狗吃骨头。一只小动物在吃鱼的时候就是小猫,在吃骨头的时候就是小狗。吃鱼和吃骨头就像是两个方法,都是小猫和小狗所特有的。

例如:

public abstract class Animal {
    public abstract void eat();
}
class Cat extends Animal{
    public void eat(){
        System.out.println("小猫吃鱼");
    }
}
class Dog extends Animal{
    public void eat(){
        System.out.println("小狗吃骨头");
    }
}
class Test {
    public static void main(String[] args) {
        Test test = new Test();
        Animal dog = new Dog();
        Animal cat = new Cat();
        test.feed(dog);
        test.feed(cat);
    }
    public void feed(Animal animal){
        animal.eat();
    }
}

动物类Animal类为小猫类和小狗类的父类,在定义对象时,将小猫类和小狗类自动转换成为动物类,因为满足已成关系所以这里的语法也是成立的,这样创建对象的方式满足,编译看左边,运行看右边。再在测试类中定义一个方法来调用动物类中的eat();方法,这样在调用时,dog对象则会调用Dog类中的eat();方法,而cat对象则会调用Cat类中的eat();方法,从而实现同类事物在不同时刻表现出不同的状态。

多态需要满足的条件:

1、子类继承父类

2、在子类中要有父类方法的重写

3、在创建对象时父类引用指向子类对象。如下:

        Animal dog = new Dog();
        Animal cat = new Cat();

什么是编译看左边,运行看右边呢?

简单来说:

程序的运行一般分为两个阶段,一个是编译阶段,一个是运行阶段。

class Test {
    public static void main(String[] args) {
        Animal dog = new Dog();
        Animal cat = new Cat();
        dog.eat();
        cat.eat();
    }
}

如果将测试类改成这样也是可以运行通过的,就是因为程序在编译期间,左边为父类,右边为子类。在调用方法时,编译时,会先看父类中有没有eat();方法,在运行时,再运行右边的子类中的eat();方法,不论这两个条件哪个都不满足,则程序便会运行不了。

在多态中还存在多态之间的转型:

多态的转型类似于基本类型转换,

自动类型转换:子类转换为父类,子类上升为父类

一般使用这种方法来实现多态

强制类型转换:父类转换为子类

如果子类存在父类中没有的方法,并且在创建子类对象时自动转换成为了父类,如果想要调用子类特有的方法,则必须先把类型强制转换为子类类型。

语法格式为:

Dog(子类类型的类型名) dog1(变量名) = (Dog) dog(父类类型变量名);

如果不知道创建的对象引用变量是什么类型的话,可以使用下面的方法先来判断一下:

if(dog instanceof Dog){ }//这句话的意思是:判断dog1是否为Dog类型

基本格式为:

父类引用 instanceof 具体子类类型

以上则是我所理解的多态,望采纳。

上一篇:Spring笔记:bean的自动装配


下一篇:面向对象语言三大特征——封装、继承、多态