小白日更第三十五天->方法参数的模糊匹配问题

本文探讨了Java中动态绑定在方法调用中的应用,通过代码示例解析了为什么`int`类型的参数调用`fly`方法时会转换为`float`。作者质疑了教科书中的观点,并提出自己的理解,涉及类方法表继承和类型转换规则。
摘要由CSDN通过智能技术生成

先看一段代码

public class Test01 {
    public static void main(String[] args) {
        A a = new A();
        int number=100;
        a.fly(number);
    }
}
class A{
    String name="爸爸";
    public void fly(double a){
        System.out.println("爸爸会飞"+a+"double");
    }
    public void fly(float a){
        System.out.println("爸爸会飞"+a+"float");
    }
}

运行结果是什么呢?
结果是:

爸爸会飞100.0float

分析

首先传入的number值放入那个fly方法中都是可以的,那为什么会进行第二个方法中呢。我在java核心技术卷中看到了这样一段话
在这里插入图片描述
关于动态绑定与静态绑定我在上一篇博客中已经详细解释了动态绑定、静态绑定
我们再看一段代码在这里插入图片描述
报错的意思我理解的是,我们的两个方法,一个需要float类型,一个需要double类型,如果我们传入的参数这两个都不符合的话,会把我们传入的参数进行转换,也就是会试图把Object类型的变量转换为float类型和double类型,但是我们都知道Object类是所有类的父类也就是超类。上面的书中的解释意思是,我创建的A类型的变量,然后调用fly方法,然后如果找不到合适的方法回去A的父类中去找。

其实我觉得书中说的有问题。(仅是个人见解)。每一个类都有一个方法表,里面记录方法的地址,一个类继承另一个类的时候自然会把方法继承,也就是说子类没有的方法,没必要再去父类中找了,父类一定没有。

我们再看一个例子
在这里插入图片描述

小伙伴们晕了吗?大概解释一下,两个接口,一个a,一个b,c类继承了两个接口。c类中有两个方法,一个要求是b接口的实现类,一个是a接口类型的实现类,我们知道接口是不可以实例化的。具体为什么,我下一一篇博客解释。当我们调用tt1()方法的时候,传了一个c,两个方法都可以接受,所以报错了,说我们不明确。
那最开始的例子为什么调用的是float而不是double,我个人理解。首先传入的是int类型,两个方法一个是float,一个是double,两个都不符合,那java会用凑合的方式,也就是尝试把int转换成float和double。那为什么最后转换成了float呢,我觉得java中int转换为float可能对程序的运行什么的更有利吧,具体的我也不清楚,关于这个问题我在网上找了好久也没有找到答案,所以就我个人的感觉觉得是这样的转换可能对程序,对运行更有利。

以上都是我个人的理解,有什么问题希望小伙伴们在评论区指正~~在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值