多态:一个类的多种形式就是多态。
实现方式:
-
编译时多态
- 编译期间决定目标方法
- 通过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.0, 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 testForAll {
public static void main(String[] args) {
Animal dog = new Dog();
Animal cat = new Cat();
dog.run();//dog run
dog.eat();//animal eat
cat.run();//cat run
cat.eat();//cat eat
}
}
运行时多态的实现机制
- JVM方法区(存放所有实例的方法)
- invokeVirtual指令
- 方法表(存放方法入口地址)
方法表指向实现该方法的实例,如果子类没有复写该方法,则指向其父类的实例,然后再通过invokeVirtual index指令,来调用方法。