当前位置: 首页 > 知识库问答 >
问题:

重载[复制]中为什么会出现这种行为

穆高澹
2023-03-14

当我运行这个程序时,为什么它调用带有字符串参数重载的方法。

public class StaticBindTest {

    public static void main(String args[])  {
       StaticBindTest et = new StaticBindTest();
       et.sort(null);

    }

    //overloaded method
    public void sort(Object c){
        System.out.println("Inside Collection sort method");
    }


   //another overloaded method
    public void sort(String hs){
        System.out.println("Inside HashSet sort method");
    }

}

如果我将我的方法重写为

    public void sort(String hs){
        if(hs instanceof String)
        System.out.println("Inside HashSet sort method");
    }

它将显示空白控制台,这意味着它不是String的实例,那么它为什么以这种方式调用呢?

共有3个答案

宗政洋
2023-03-14

JLS第15.12.2节解释了完整的方法论,特别是15.12.2.5(选择最具体的)。

总结是,Java总是选择适用的最具体的重载。由于null可以是任何类的实例,因此两种方法都是候选方法。而且由于StringObject的子类,因此它肯定更具体。因此调用了String重载。

至于你的结束语,null不是任何东西的实例。如果您以类似的方式编写了对象重载方法,它也不会打印任何内容,因此这并不是Java应该选择一种重载还是另一种重载的有力证据。

赫连智
2023-03-14

当我执行代码时,我发现HashSet排序方法中的在输出中<代码>null是对对象的空引用。这两种方法都有对象作为输入,这就是为什么调用层次结构更窄的字符串方法的原因
不要写入StaticBindTest et=新的StaticBindTest()
只需调用排序(空)
而无需对象et

奚修伟
2023-03-14

因为在方法重载的情况下

The most specific method is choosen at compile time.

因为java.lang.String是比java.lang.Object更具体的类型。在您的例子中,选择将String作为参数的方法。

文件中明确提及

 类似资料:
  • 本文向大家介绍请你解释为什么会出现4.0-3.6=0.40000001这种现象?相关面试题,主要包含被问及请你解释为什么会出现4.0-3.6=0.40000001这种现象?时的应答技巧和注意事项,需要的朋友参考一下 考察点:计算机基础 原因简单来说是这样:2进制的小数无法精确的表达10进制小数,计算机在计算10进制小数的过程中要先转换为2进制进行计算,这个过程中出现了误差。

  • 问题内容: 我已经调整了控制器的构造函数和fxml,以便将控制器的fxml的所有设置都放在fxml中,除了FXML的构造和fxml的加载。这是我的控制器: 和我的fxml文件: 当调用fxmlLoader.load()并返回FXMLLoader时会发生stackoverflow fxmlLoader = new FXMLLoader(…),然后再次调用fxmlLoader.load()…为什么会发

  • 为什么会引发主线程上的网络异常?its在异步任务上 } 编辑: 完整代码: logcat:

  • 问题内容: 当我运行以下代码时: 我得到一个异常说: 为什么会出现此异常? 编辑:tmpList是一个LinkedList,其每个节点都包含DepConfAttr类型的对象。 我正在基于内存(首先是最高内存)对tmpList进行排序,这是DepConfAttr对象的属性之一。 上面的代码反映了我要通过以下代码实现的目标 问题答案: 为什么会出现此异常? 您要遍历列表,而不是通过迭代器从列表中删除一

  • 我得到一个当我运行我的Java应用程序。典型的原因是什么?

  • 我已经调整了控制器构造函数和fxml,所以除了fxml构造和fxml加载之外,控制器的所有fxml设置都在fxml中。这里是我的控制器: