Java编译器如何为重载和覆盖的方法生成代码

这里有个简单的例子,展示了多态性(Polymorphism):重载(Overloaded)和覆盖(Overridden)。

多态性意味着方法可以在不同的时刻表现出不同的形式。在编译期间,这被称为方法重载。重载允许相关的方法可以使用相同的方法名访问。有时候这被称为ad hoc polymorphism,与parametric polymorphism 不同。

class A {
    public void M(int i){
        System.out.println("int");
    }

    public void M(String s){
        //this is an overloading method
        System.out.println("string");
    }
}

class B extends A{
    public void M(int i){
        //this is overriding method
        System.out.println("overriden int");
    }
}

public static void main(String[] args) {
    A a = new A();
    a.M(1);
    a.M("abc");

    A b = new B(); //运行时,b的实际类型是B
    b.M(1234);
}

输出:

int
string
overriden int

从编译器的角度讲,如何生成能够正确调用的函数的代码?

静态重载(Static overloading)不难实现。当处理一个重载方法的声明时,一个新的绑定会被映射到一个不同的实现。在处理类型检查的过程中,编译器会分析参数的实际类型,然后决定使用哪个方法。

动态重载(Dynamic overloading )允许运行时根据实际参数的类型来选择函数的不同实现。这是动态调度(dynamic dispatch)的一种形式。

动态调度也被用来实现方法覆盖。被覆盖的方法的调用由运行期间实际对象的类型决定的。

为了理解动态调度,可以看这篇文章object layout in memory.

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容