本文为学习笔记,学习资料为:【Java面试题】谈谈对Java多态的理解_哔哩哔哩_bilibili
多态的英文是polimorphism,poli为“许多”,morphism为“形态”。
编译期间决定目标方法;通过overloading方法重载实现;方法名相同,参数不同。
class AddNumbers { public int addition (int x, int y) { return x + y; } public int addition (int x, int y, int z) { return x + y + z; } public int addition (double x, int y) { return (int)x + y; } public static void main (String[] args) { AddNumbers a1 = new AddNumbers(); System.out.println(a1.addition(1, 2)); System.out.println(a1.addition(1, 2, 3)); System.out.println(a1.addition(3, 4)); } }
运行期间决定目标方法;同名同参(子类复写父类方法);overriding方法重写和继承实现;JVM决定目标方法。
class Animal { void run() { System.out.println("animal is running..."); } void eat() { System.out.println("animal is eating..."); } } class Dog extends Animal { void run() { System.out.println("dog is running..."); } } class Cat extends Animal { void run() { System.out.println("cat is running..."); } void eat() { System.out.println("cat is eating..."); } } public class AnimalDemo { public static void main(String[] args) { Animal dog = new Dog(); Animal cat = new Cat(); dog.run();//dog is running... dog.eat();//animal is eating... 因为dog没有重写(overriding) eat()方法,所以执行父类方法 cat.run();//cat is running... cat.eat();//cat is eating... } }
方法表
JVM结构
JVM在方法区调用目标方法,通过invokeVirtual指令进行调用,通过方法表寻找方法的入口地址,通过invokeindex调用方法。
在回答时,要答出:多态是什么?一个类的多种形式即多态。(一个对象变量可以指示多种实际类型的现象,称为多态。)多态的实现方式:编译时多态和运行时多态,也称为静态多态和动态多态。多态实现原理,以及方法表的作用。方法的实际入口地址指向的是最终实现了该方法的那个类的实例。