上次已经为大家介绍过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工具网。
推荐阅读: