当前位置: 首页 > 面试题库 >

Java 基于参数实型的重载方法选择

赫连彬炳
2023-03-14
问题内容

我正在尝试以下代码:

interface Callee {
    public void foo(Object o);
    public void foo(String s);
    public void foo(Integer i);
}

class CalleeImpl implements Callee
    public void foo(Object o) {
        logger.debug("foo(Object o)");
    }

    public void foo(String s) {
        logger.debug("foo(\"" + s + "\")");
    }

    public void foo(Integer i) {
        logger.debug("foo(" + i + ")");
    }
}

Callee callee = new CalleeImpl();

Object i = new Integer(12);
Object s = "foobar";
Object o = new Object();

callee.foo(i);
callee.foo(s);
callee.foo(o);

打印foo(Object o)三遍。我希望方法选择要考虑实际的(而不是声明的)参数类型。我想念什么吗?是否有修改此代码,以便它会打印的方式foo(12)foo("foobar")和foo(Object o)?


问题答案:

我希望方法选择要考虑实际的(而不是声明的)参数类型。我想念什么吗?

是。您的期望是错误的。在Java中,动态方法分派仅发生在调用方法的对象上,而不发生在重载方法的参数类型上。

引用Java语言规范:

调用方法时(第15.12节),实际参数(和任何显式类型参数)的数量以及参数的编译时类型 在编译时用于确定将被调用的方法的签名( §15.12.2)。如果要调用的方法是实例方法,则将在运行时使用动态方法查找(第15.12.4节)确定要调用的实际方法。



 类似资料:
  • 本文向大家介绍基于Java中参数顺序的方法重载,包括了基于Java中参数顺序的方法重载的使用技巧和注意事项,需要的朋友参考一下 在方法重载中,该类可以有多个具有相同名称的方法,但方法的参数列表不应相同。确保参数列表不同的一种方法是更改方法中参数的顺序。 演示此的程序如下所示- 示例 输出结果 现在让我们了解上面的程序。 在方法重载的实现中,使用两个方法创建PrintValues类。其中的第一个分别

  • 问题内容: 我试图弄清楚Java如何选择执行哪种方法: 我在这里学到的是 方法签名是根据编译时数据类型确定的 实际调用的方法取决于调用该方法的对象的动态类型。 基于此,前两个调用的结果符合预期。但是,我不理解示例3和4的结果。 它似乎是在Java语言规范中指定的,但我不理解。 问题答案: 但是,我不理解示例3和4的结果。 好吧,让我们单独看一下。 例子3 重要的部分是表达式和的 编译时 类型。 仅

  • 问题内容: 示例代码为: 输出为: 的第一个调用会调用带有String参数的方法,根据可以理解。 1)谁能解释我在先前的调用中是基于什么来调用的? 2)再说一次,说一个if条件: 它总是使用 调用方法。 编译器在编译时会计算表达式吗?我想知道表达式是在编译时还是在运行时计算的。谢谢。 问题答案: Java使用早期绑定。在编译时选择最具体的方法。根据参数数量和参数类型选择最具体的方法。在这种情况下,

  • 我读了一篇关于使用选项作为方法参数的文章,大家一致认为永远不要使用选项作为方法参数。 Guava可选作为可选参数的方法参数 这种使用作为方法参数的情况合法吗?如果不是,我如何使这是可列举的?

  • 本文向大家介绍Java基于高精度整型实现fibonacci数列的方法,包括了Java基于高精度整型实现fibonacci数列的方法的使用技巧和注意事项,需要的朋友参考一下 本文以实例形式讲述了Java基于高精度整型实现fibonacci数列的方法,分享给大家供大家参考之用。具体方法如下: 希望本文所述对大家的Java程序设计有所帮助。

  • 我正在制作一个Java类,在这个类中,我可以用DTO对列表应用一个过滤器(searchterms)。筛选器如下所示: 在我的类中,我有以下方法,将所有筛选器应用到列表: 但是根据字段的类型有不同的实现。与字符串类似,我创建了一个正则表达式: 但就像一个Float我想要另一个比较,我不想应用正则表达式到一个Float。要确保根据字段的类型调用正确的方法,最好的方法是什么?