Java编译器如何生成重载和覆盖方法代码
2016-05-14 22:48
477 查看
下面是一个很简单的例子,关于Java中的多态:方法重载和方法覆盖;
多态指的是方法在不同的时刻表现出不同的形式;在编译期间,这被叫做方法重载;方法重载允许相关的方法被同一个方法名字调用,这有时候被叫做ad-hoc polymorphism;
那么对于编译器来说,如何生成方法代码以便能被正确调用呢?
静态重载的实现并不难,当处理重载方法声明的时候,将他们绑定到不同的实现,在类型检查的时候,编译器分析参数类型来决定哪个方法被调用;
动态重载允许在运行期间根据实际参数类型来选择不同的方法实现,这是动态分发(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/
多态指的是方法在不同的时刻表现出不同的形式;在编译期间,这被叫做方法重载;方法重载允许相关的方法被同一个方法名字调用,这有时候被叫做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/
相关文章推荐
- Java程序与数据库连接
- Java中哪个JSON库的解析速度是最快的?
- eclipse安装配置github插件egit
- RxJava源码初步分析
- Java 序列化机制(二) -- 控制序列化的兼容性
- Java 核心技术 I chap 1 ~ 4 阅读摘要
- Java实现-高效排序算法之基数排序
- Java内存模型与垃圾回收
- Java Comparable 和 Comparator
- Java Comparable 和 Comparator
- Java模式之责任链模式
- SpringMVC annotation注解版helloworld
- Spring中@Transactional用法
- java验证码中的数字、字母、汉字如何随机生成
- 走进JavaWeb
- Java反射机制实现与原理
- SpringMVC helloworld (xml版本)
- springmvc数据格式化
- Spring对jdbc的支持。
- JDK源码解析之List和Set接口