java重载疑惑
2015-06-15 18:02
507 查看
首先是Base代码
class Base {
@Override
public String toString() {
return "Base";
}
}
Child代码
class Child extends Base {
@Override
public String toString() {
return "Child";
}
}
Main代码
class Main {
public void test(Base base) {
System.out.print("Function for Base: ");
System.out.println(base);
}
public void test(Child child) {
System.out.print("Function for Child: ");
System.out.println(child);
}
public static void main(String[] args) {
Child child = new Child();
Base base = new Base();
Main ts = new Main();
ts.test(child);
ts.test(base);
ts.test(child);
}
}
编译运行没有问题。十分疑惑,javac或jvm是怎么判断该调用哪个方法。查看class文件,发现是由javac生成字节码是就指定了调用方法。
<pre name="code" class="plain"> 24: aload_3 25: aload_1 26: invokevirtual #13 // Method test:(LChild;)V 29: aload_3 30: aload_2 31: invokevirtual #14 // Method test:(LBase;)V 34: aload_3 35: aload_1 36: invokevirtual #13 // Method test:(LChild;)V
修改下代码,去掉public void test(Child child)方法。字节码为
<pre name="code" class="plain"> 24: aload_3 25: aload_1 26: invokevirtual #12 // Method test:(LBase;)V 29: aload_3 30: aload_2 31: invokevirtual #12 // Method test:(LBase;)V 34: aload_3 35: aload_1 36: invokevirtual #12 // Method test:(LBase;)V
是由javac来选择方法的,这部分等查阅了java语言规范,再研究下。
class Base {
@Override
public String toString() {
return "Base";
}
}
Child代码
class Child extends Base {
@Override
public String toString() {
return "Child";
}
}
Main代码
class Main {
public void test(Base base) {
System.out.print("Function for Base: ");
System.out.println(base);
}
public void test(Child child) {
System.out.print("Function for Child: ");
System.out.println(child);
}
public static void main(String[] args) {
Child child = new Child();
Base base = new Base();
Main ts = new Main();
ts.test(child);
ts.test(base);
ts.test(child);
}
}
编译运行没有问题。十分疑惑,javac或jvm是怎么判断该调用哪个方法。查看class文件,发现是由javac生成字节码是就指定了调用方法。
<pre name="code" class="plain"> 24: aload_3 25: aload_1 26: invokevirtual #13 // Method test:(LChild;)V 29: aload_3 30: aload_2 31: invokevirtual #14 // Method test:(LBase;)V 34: aload_3 35: aload_1 36: invokevirtual #13 // Method test:(LChild;)V
修改下代码,去掉public void test(Child child)方法。字节码为
<pre name="code" class="plain"> 24: aload_3 25: aload_1 26: invokevirtual #12 // Method test:(LBase;)V 29: aload_3 30: aload_2 31: invokevirtual #12 // Method test:(LBase;)V 34: aload_3 35: aload_1 36: invokevirtual #12 // Method test:(LBase;)V
是由javac来选择方法的,这部分等查阅了java语言规范,再研究下。
相关文章推荐
- SpringMVC中使用@ResponseBody注解返回值,Ajax取得中文乱码解决方法
- 使用springAOP时没有引入aopalliance包时报的错
- java通过ssl连接LDAP服务器(包括LDAP服务器搭建、openssl数字证书生成、openldap服务器配置启动)
- Java 在Eclipse中的操作技巧
- java.lang.NoClassDefFoundError: com.baidu.mapapi.SDKInitializer(解决方法)
- spring3零配置注解实现Bean定义(包括JSR-250、JSR-330)
- java.io.IOException: This archive has already been finished
- java 反射访问方法
- SpringMVC返回json数据的三种方式
- Eclipse Android 项目 以全新AS结构导入Android Studio
- java 反射
- Java for LeetCode 223 Rectangle Area
- Java算法题
- Scala与JAVA交互
- eclipse 添加git pull、push
- java 数字处理与位运算
- Java集合类的使用
- java中最常用jar包的用途说明,适合初学者
- Java for LeetCode 221 Maximal Square
- 用JDK自带的工具生成客户端调用Webservice的代码