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

本文通过一个简单的Java示例,详细介绍了多态的概念,包括方法重载和方法覆盖,并解释了编译器如何处理这些情况。重点讲解了静态重载与动态分发的实现机制。

下面是一个很简单的例子,关于Java中的多态:方法重载和方法覆盖;

多态指的是方法在不同的时刻表现出不同的形式;在编译期间,这被叫做方法重载;方法重载允许相关的方法被同一个方法名字调用,这有时候被叫做ad-hoc polymorphism;

package simplejava;

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 class Q13 {

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

}

那么对于编译器来说,如何生成方法代码以便能被正确调用呢?

静态重载的实现并不难,当处理重载方法声明的时候,将他们绑定到不同的实现,在类型检查的时候,编译器分析参数类型来决定哪个方法被调用;

动态重载允许在运行期间根据实际参数类型来选择不同的方法实现,这是动态分发(dynamic dispatch)的一种形式;

动态分发(dynamic dispatch)同样可以用于实现方法覆盖,被覆盖的方法的调用由运行期间实际对象的类型来决定;

如果需要进一步理解动态分发(dynamic dispatch),可参考如下链接,关于对象在内存中的分布:

http://www.programcreek.com/2011/11/what-do-java-objects-look-like-in-memory/

 

译文链接:http://www.programcreek.com/2011/10/how-java-compiler-generate-code-for-overloaded-and-overridden-methods/

转载于:https://www.cnblogs.com/chenpi/p/5493809.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值