Java解惑46

2017-06-29  本文已影响0人  猴猴猪027

理论

Java在调用同名函数时,如果实参满足多个同名函数的不同形参。那么最为精确的一个方法会被调用。例如test(Object object)和test(String string)都满足时。会选择更精确的一个方法。
何为更精确,如果有方法A,方法B,如果方法A的所有入参可以作为方法B的入参,同时方法B有的入参不能作为方法A的入参,那么就说A比B要精确(实用范围更小)

例子

这里有两个例子:

public class Confusing {


    private Confusing(Object o){
        System.out.println("Object");
    }
    
    private Confusing(double[] dArray){
        System.out.println("double array");
    } 
    
    public static void main(String[] args){
        new Confusing(null);
    }

}

运行结果如下:

Connected to the target VM, address: '127.0.0.1:58636', transport: 'socket'
double array

其实在ide中null前面已经显示是dArray,因为double[]也是引用类型,Object也是引用类型,能作为double[]参数的一定可以作为Object的参数。

另一个例子:

public class Eat {

    public static void eatSomething(Object object){
        System.out.println("eat object");
    }

    public static void eatSomething(Integer count){
        System.out.println("eat Integer");
    }

//    public static void eatSomething(String count){
//        System.out.println("eat String");
//    }
}

public class Confusing {


    private Confusing(Object o){
        System.out.println("Object");
    }

    private Confusing(double[] dArray){
        System.out.println("double array");
    }

    public static void main(String[] args){
       Eat.eatSomething(null);
    }

}

结果是

Connected to the target VM, address: '127.0.0.1:58671', transport: 'socket'
eat Integer

如果把注释去掉,main方法所在的类无法编译通过,因为有两个精确度一样的方法,不知道选择哪一个。

上一篇 下一篇

猜你喜欢

热点阅读