首页 > Java > java教程 > Java 方法重载是否考虑运行时参数类型或仅考虑编译时声明的类型?

Java 方法重载是否考虑运行时参数类型或仅考虑编译时声明的类型?

Barbara Streisand
发布: 2024-12-31 18:55:10
原创
1008 人浏览过

Does Java Method Overloading Consider Runtime Parameter Types or Only Compile-Time Declared Types?

重载方法选择:实数与声明的参数类型

在 Java 编程中,重载方法提供了使用相同的方法定义多个方法的灵活性名称但参数列表不同。调用方法时,编译器会根据提供的参数列表确定要调用的适当方法。

但是,在某些情况下,您可能想知道方法选择是否考虑参数的实际(运行时)类型所声明的类型。考虑以下代码:

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

class CalleeImpl implements Callee {
    @Override
    public void foo(Object o) { System.out.println("foo(Object o)"); }
    @Override
    public void foo(String s) { System.out.println("foo(\"" + s + "\")"); }
    @Override
    public void foo(Integer i) { System.out.println("foo(" + i + ")"); }
}

public class Main {
    public static void main(String[] args) {
        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)”。与直觉相反,方法选择没有考虑实际参数类型(整数、字符串和对象)。相反,它仅依赖于 Callee 接口中声明的参数类型。

此行为源于 Java 语言规范,其中明确指出:

When a method is invoked, the number of actual arguments and the compile-time types of the arguments are used, at compile time, to determine the signature of the method that will be invoked.
登录后复制

因此,需要注意的是在Java中,动态方法调度,即在运行时根据调用的对象确定实际调用的方法,仅适用于对象本身,不适用于参数类型。

以上是Java 方法重载是否考虑运行时参数类型或仅考虑编译时声明的类型?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板