先看一段代码
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可能对程序的运行什么的更有利吧,具体的我也不清楚,关于这个问题我在网上找了好久也没有找到答案,所以就我个人的感觉觉得是这样的转换可能对程序,对运行更有利。
以上都是我个人的理解,有什么问题希望小伙伴们在评论区指正~~