java重载疑惑

首先是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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值