>Java >java지도 시간 >Java 메소드 오버로딩은 런타임 매개변수 유형을 고려합니까, 아니면 컴파일 타임에 선언된 유형만 고려합니까?

Java 메소드 오버로딩은 런타임 매개변수 유형을 고려합니까, 아니면 컴파일 타임에 선언된 유형만 고려합니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-31 18:55:101013검색

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.