如何理解Java的多态(JVM)
如何理解Java的多态(JVM)

如何理解Java的多态(JVM)

编译时多态

  • 编译期间决定目标方法
  • Overload
  • 方法名相同,参数不同
public class StaticDispatch {
    static abstract class Human {}

    static class Man extends Human{}
    static class Woman extends Human{}

    public void sayHello(Human guy) {
	System.out.println("hello, guy");
    }
    public void sayHello(Man guy) {
	System.out.println("hello, gentleman");
    }
    public void sayHello(Woman guy) {
	System.out.println("hello, lady");
    }

    public static void main(String[] args) {
	Human man = new Man();
	Human woman = new Woman();

	StaticDispatch sr = new StaticDispatch();
	sr.sayHello(man);//hello, guy
	sr.sayHello(woman);//hello, lady
    }
}

运行时多态

  • 运行期间决定目标方法
  • 同名同参
  • Override
  • JVM决定目标方法
public class DynamicDispatch {
    static abstract class Human{
	protected abstract void sayHello();
    }

    static class Man extends Human{
	@Override
	protected void sayHello() {
	    System.out.println("man say hello");
	}
    }

    static class Woman extends Human{
	@Override
	protected void sayHello() {
	    System.out.println("woman say hello");
	}
    }

    public static void main(String[] args) {
	Human man = new Man();
	Human woman = new Woman();
	man.sayHello();//man say hello
	woman.sayHello();//woman say hello
    }
}

JVM运行时多态实现机制

  1. 在JVM方法区中存在方法表
  2. 方法表中存放方法入口地址
  3. 通过invokeVirtual指令寻找地址

发表评论

邮箱地址不会被公开。