您的位置:首页 > 编程语言 > Java开发

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语言规范,再研究下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: