java重载疑惑

来源:互联网 发布:mac vim 进入编辑模式 编辑:程序博客网 时间:2024/06/05 23:03

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

0 0
原创粉丝点击