程序园程序员程序员技术栈

详解 JVM 字节码(6)重载

2019-05-04  本文已影响32人  zidea
jvm

栈帧

【图】

public class ClientA {
    public static void test(){
        System.out.println("test invoked");
    }

    public static void main(String[] args) {
        test();
    }
}

静态调用
class A {}
class B extends A{}
class C extends B{}
public class ClientB {
    public void print(A a){
        System.out.println("A class");
    }
    public void print(B b){
        System.out.println("B class");
    }
    public void print(C c){
        System.out.println("C class");
    }

    public static void main(String[] args) {
        A b = new B();
        A c = new C();
        ClientB clientB = new ClientB();
        clientB.print(b);
        clientB.print(c);
     }
}
A class
A class

方法的静态分派,用于 A 声明了 b ,所以 A 就是 b 的静态类型,而 b 的实际类型是 B 类型(也就是 b 的指向类型)。
b 的静态类型和实际类型,静态类型是不会改变的。即使强转也不会改变的 b 的静态类型。而实际类型是可以发生变化。这也是 JVM 对 java 多态实现的底层支持。
调用 print 的对象 clientB 这是在编译中已经确定,方法的重载对于 JVM 是一种静态行为,根据对象的静态类型来决定调用哪一个对应的方法。


字节码
上一篇 下一篇

猜你喜欢

热点阅读