本文为学习笔记,学习资料为:【Java面试题】谈谈对Java多态的理解_哔哩哔哩_bilibili
多态的英文是polimorphism,poli为“许多”,morphism为“形态”。
多态的形式
1)编译时多态
编译期间决定目标方法;通过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));
}
}
2)运行时多态
运行期间决定目标方法;同名同参(子类复写父类方法);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调用方法。
总结
在回答时,要答出:多态是什么?一个类的多种形式即多态。(一个对象变量可以指示多种实际类型的现象,称为多态。)多态的实现方式:编译时多态和运行时多态,也称为静态多态和动态多态。多态实现原理,以及方法表的作用。方法的实际入口地址指向的是最终实现了该方法的那个类的实例。