首先是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语言规范,再研究下。