zoukankan      html  css  js  c++  java
  • 重载方法调用精确匹配问题

    判断到底调用了哪个方法

    package example;
    public class Test{ 
        public void info(Object obj,double count){
            System.out.println("obj参数为"+obj);
            System.out.println("count参数为"+count);
        }
        public void info(Object[] objs,double count){
            System.out.println("objs参数为"+objs);
            System.out.println("count参数为"+count);
        }
        public static void main(String[] args) {
            Test t=new Test();
            t.info(null, 5);
        }
    }

    由于第一个参数是null,既匹配第一个info()也匹配第二个info(),这时候会匹配哪个呢

    objs参数为null
    count参数为5.0

    根据输出结果我们发现调用个第二个方法。

    根据精确匹配原则,当实际调用时传入的实参同时满足多个方法时,如果某个方法要求的参数范围越小,那这个方法就越精确,

    很明显,Object[]可以看做Object的子类,范围更小。

    但当我们队第二个参数类型做出改变时

    package example;
    public class Test{ 
        public void info(Object obj,int count){
            System.out.println("obj参数为"+obj);
            System.out.println("count参数为"+count);
        }
        public void info(Object[] objs,double count){
            System.out.println("objs参数为"+objs);
            System.out.println("count参数为"+count);
        }
        public static void main(String[] args) {
            Test t=new Test();
            // t.info(null, 5); 编译失败
        } 
    }

    编译失败的原因时,JVM无法判断更匹配实际调用。

  • 相关阅读:
    iOS 语录
    接口的理解
    android中src和background区别
    onItemClick 参数解释
    工作空间项目不存在,eclipse中项目删不掉
    [转载] IIS来搭建一个只能实现基本功能的FTP服务器
    [转]C# FTP操作类
    [转] VS2017 打包安装程序
    笔记本睿频的关闭与开启 [转载]
    C# 线程:定时器的使用
  • 原文地址:https://www.cnblogs.com/xurui1995/p/5348523.html
Copyright © 2011-2022 走看看