java中多态怎么实现接口?实例展示

BSO 2020-11-11 16:07:30 java常见问答 6490

上次已经为大家介绍过java中多态的机制有哪几种的主要内容了。java中实现的方式也是比较多的,今天主要介绍的是多态实现接口的主要做法,一起来了解一下吧。

多态的实现方式:实现接口相比而言就更加复杂,原因在于,Java的单继承保证了类的线性关系,而接口可以同时实现多个,这样光凭偏移量就很难准确获得方法的指针。所以在JVM中,多态的实例方法调用实际上有两种指令:

1.invokevirtual指令用于调用声明为类的方法;

2.invokeinterface指令用于调用声明为接口的方法。

当使用invokeinterface指令调用方法时,就不能采用固定偏移量的办法。在性能上,调用接口引用的方法通常总是比调用类的引用的方法要慢。在类和接口之间优先选择接口作为设计并不总是正确的。

多态机制包括静态多态(编译时多态)和动态多态(运行时多态),静态多态比如说重载,动态多态是在编译时不能确定调用哪个方法,得在运行时确定。动态多态的实现方法包括子类继承父类和类实现接口。当多个子类上转型(不知道这么说对不)时,对象掉用的是相应子类的方法,这种实现是与JVM有关的。

接下来为大家展示一个多态的实例,代码如下所示:

/*
对象的多态性:动物 x = new 猫();
函数的多态性:函数重载、重写
1、多态的体现
		父类的引用指向了自己的子类对象
		父类的引用也可以接收自己的对象
2、多态的前提
		必须是类与类之间只有关系,要么继承或实现
		通常还有一个前提,存在覆盖
3、多态的好处
		多态的出现大大的提高了程序的扩展性
4、多态的弊端
		只能使用父类的引用访问父类的成员
5、多态的应用
6、注意事项
*/
/*
需求:
猫,狗。
*/
abstract class Animal
{
    abstract void eat();
}
class Cat extends Animal
{
    public void eat()
    {
        System.out.println("吃鱼");
    }
    public void catchMouse()
    {
        System.out.println("抓老鼠");
    }
}
class Dog extends Animal
{
    public void eat()
    {
        System.out.println("吃骨头");
    }
    public void kanJia()
    {
        System.out.println("看家");
    }
}
class DuoTaiDemo
{
    public static void main(String[] args)
    {
        function (new Cat());
        
        function (new Dog());
        Animal a = new Cat(); //向上转型
        a.eat();
        Cat c = (Cat) a; //向下转型
        c.catchMouse();
    }
    public static void
    function (Animal a)
    {
        a.eat();
        //用于子类型有限
        //或判断所属类型进而使用其特有方法
        if (a instanceof Cat)
        {
            Cat c = (Cat) a;
            c.catchMouse();
        }
        else if (a instanceof Dog)
        {
            Dog c = (Dog) a;
            c.kanJia();
        }
    }
}
key: 向上转型、 向下转型、 instanceof

java中关于多态的知识涉及到了很多方面,这也是在学习java的过程当中经常会遇到的问题。如果你想要了解更多java经典例子,敬请关注奇Q工具网。

推荐阅读:

java多态是什么意思?实例分享

java面向对象的三大核心特性,多态性详细介绍

Java多态性,重写怎样实现多态性?