多态:一个类的多种形式就是多态。

实现方式:

  • 编译时多态

  • 编译期间决定目标方法
  • 通过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指令
  • 方法表(存放方法入口地址) alt alt 方法表指向实现该方法的实例,如果子类没有复写该方法,则指向其父类的实例,然后再通过invokeVirtual index指令,来调用方法。