Java多态实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java多态实现相关的知识,希望对你有一定的参考价值。

当父类型引用指向子类型对象会导致程序存在编译阶段绑定和运行阶段绑定两个不同的状态,这种机制可以成为多态机制.
向上转型:子类型-->父类型,又称为自动类型转换.
向下转型:父类型-->子类型,又称为强制类型转换.


//Animal.java
package qw;
public class Animal {
    public void move()
    {
        System.out.println("动物在移动");
    }
    public void eat() {
        System.out.println("动物在吃");
    }
}

//Bird.java
package qw;
public class Bird extends Animal{
    public void fly()
    {
        System.out.println("小鸟在飞");
    }
    public void eat() {
        System.out.println("小鸟在吃东西");
    }
}

//Cat.java
package qw;
public class Cat extends Animal{

    public void move()
    {
        System.out.println("猫在移动");
    }
    public void catchMouse()
    {
        System.out.println("猫在捉老鼠");
    }
}

//Test.java
package qw;
public class Test {
    public static void main(String[] args) {
        Animal a1 = new Animal();
        a1.move();

        //向上转型(子对象向父对象转型),a2使用的是继承的方法,可使用方法覆盖父类继承下来的方法.
        //1,编译阶段编译器检查a2这个引用的数据类型为Animal,由于Animal.class字节码当中有move()方法
        //所以编译通过了,这个阶段成为静态绑定
        //2,在程序运行阶段,由于JVM堆内存真实存在的对象是Cat对象,所以一定调用的是Cat对象的move()方法,这个过程
        //称为动态绑定
        //3.无论Cat类有没有重写方法,运行阶段调用的一定是Cat类的move()方法,因为JVM堆内存中真实存在的对象是Cat对象.
        Animal a2 = new Cat();
        a2.move();
        a2.eat();

        //如果想访问子对象特有的方法,需强制换成子对象,即向下转型(父对象向子对象转型)
        if(a2 instanceof Cat) {
            Cat a3 = (Cat)a2;
            a3.catchMouse();
        }
        else {
            Bird a3 = (Bird) a2;
            a3.fly();
        }
    }
}

运行结果:
技术图片

特点:无论是向上转型还是向下转型,两种类型之间一定要有继承关系,且具有面向抽象编程的特性,.
多态作用:降低程序的耦合度,提高程序的拓展力.

以上是关于Java多态实现的主要内容,如果未能解决你的问题,请参考以下文章

将 UML 图实现为 java 代码(同时使用聚合和多态)

什么是多态性,C++中是如何实现多态的

深入Java核心 Java中多态的实现机制

Java 多态

java多态

C++中多态是怎样实现的?