Java解惑46

理论

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方法所在的类无法编译通过,因为有两个精确度一样的方法,不知道选择哪一个。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容