2013-09-29 2 views
0

자바에서 오버로드 메서드를 테스트 할 짧은 프로그램이 있습니다. 이 내 코드입니다 :다른 데이터 유형의 매개 변수로 실행중인 메서드를 오버로드하는 방법은 무엇입니까?

public static void main(String[] args) { 
    // TODO code application logic here 
    // Case 1 
    f2(5); 
    // Case 2 
    char x = 'a'; 
    f2(x); 
    // Case 3 
    byte y = 0; 
    f2(y); 
    // Case 4 
    float z = 0; 
    f2(z); 
} 

그리고 내 방법이 있습니다 :

public static void prt(String s) { 
    System.err.println(s); 
} 

public static void f2(short x) { 
    prt("f3(short)"); 
} 

public static void f2(int x) { 
    prt("f3(int)"); 
} 

public static void f2(long x) { 
    prt("f5(long)"); 
} 

public static void f2(float x) { 
    prt("f5(float)"); 
} 

는 이것은 결과입니다

f3(int) 
f3(int) 
f3(short) 
f5(float) 

나는 이해할 수 없다는 어떻게 사건이 실행 않는다 3. 나에 대한 설명이 있나?

답변

2

오버로드 된 메서드의 경우 메서드 호출은 형식 매개 변수와 전달한 실제 형식을 기반으로 가장 구체적인 메서드를 호출합니다.

메소드 호출 변환은 다음과 같은 경로를 다음과

  • 신원 변환 : 먼저 정확한 매칭 방법이 검색됩니다. 발견되면, 호출됩니다. 유형에서 유형으로의 변환.
  • 확대 원문 변환 : 정확한 일치 방법이 없으면 실제 인수에서 형식 유형 매개 변수로의 확대 변환을 기반으로 방법이 선택됩니다.

더 많은 정보가 여기에 있습니다. JLS 5.3 for Method Invocation Conversion을 참조하십시오.

그래서, f2(x);에 대한 char 유형에 대한 정확한 일치 방법 f2(int) 어떤 char이 변환을 확대에 의해 변환 될 수있는 가장 구체적인 유형으로, 호출, 그래서 없기 때문에 int입니다. 아니요, char ~ short은 확대 변환이 아닙니다. 방법 f2(short)가 호출되도록 shortbyte가로 확대 할 수있는 가장 구체적인 유형이 같은

Similary는 f2(y)를 들어, byte 유형에 대해 정확하게 일치가 없다.

JLS 5.1.2 for Widening Primitive conversions 참조 :

19 개 특정한 확대 원시적 변환이라고 원시적 형에 변환 :

  • byteshort에, int, longfloat을, 또는에 double
  • shortint, long, float, 또는 intdouble
  • char, long, float, 또는 double
+0

정말 고마워요! – Thangnv

관련 문제