2014-02-24 3 views
2
public class Superhero { 
    String s; 
    public Superhero() { 
     s = "I'M A SUPERHERO"; 
     System.out.println(s); 
    } 

    public void punch() { 
     System.out.println("Punch! Punch!"); 
    } 

    public void punch(Superhero a) { 
     System.out.println("BOOM" + s); 
    } 
} 
public class Batman extends Superhero { 
    String s; 
    public Batman() { 
     s = "NANANANANA"; 
    } 

    public Batman(String s) { 
      this.s = s; 
     System.out.println(this.s); 
    } 

    public void punch(Superhero v) { 
     s = "BATMAN!"; 
     super.punch(v); 
     System.out.println("BOOM " + s); 
    } 

    public void punch(Batman b) { 
     System.out.println("Wat."); 
    } 

    public static void main(String[] args) { 
     Superhero superhero = new Batman(); 
     superhero.punch((Batman) superhero); 
    } 
} 

왜 이것이 유효한 코드입니까? 그것은 Superhero 인 정적 유형에 대해 punch(Batman b) 함수를 찾지 않으며 서명을 정확하게 일치시키는 함수가 없으므로 컴파일 타임 오류가 아닐까요? 그것이 무엇을하는지에 따라, 그것은 슈퍼 히어로 클래스에서 punch(Superhero a)을 실행합니다.다른 매개 변수로 어떤 메소드를 실행합니까?

"I'M A SUPERHERO" 
"BOOM I'M A SUPERHERO" 
"BOOM BATMAN! 
+1

주의! '슈퍼 히어로 '에서'배트맨'의 변수's'는's'을 가리 킵니다. –

답변

1

배트맨에서

이 결과는 그렇게 public void punch(Superhero a)배트맨 매개 변수를 사용하여 호출 할 완벽하게 유효한 슈퍼 히어로입니다.

명확히하기 위해 public void punch(Superhero a)은 펀치 메서드가 모든 유형의 슈퍼 히어로 개체와 함께 호출 될 수 있다고 명시합니다. 슈퍼 히어로의 하위 유형 인 모든 클래스는 슈퍼 히어로이므로이 메소드는 슈퍼 히어로 또는 슈퍼 히어로의 하위 유형을 매개 변수로 사용할 수 있습니다.

+5

슈퍼 히어로 질문에 조커가 대답하는 아이러니입니다. – Reimeus

+1

@ Reimeus 하하, 실제로 배트맨 이죠. –

관련 문제