2014-09-25 2 views
1
public class Test { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     Animal a=new Animal(); 
     a.speak(); 

     Animal d=new Dog(); 
     d.speak(3);//   
    } 

    class Animal 
    { 
     public float speak() 
     { 
      System.out.println("I am a animal!"); 
      return 0; 
     } 
    } 

    class Dog extends Animal 
    { 
     public double speak(int a) 
     { 
      System.out.println("Dog sparks!"); 
      return 0; 
     } 
    } 
} 

방금 ​​Java에서 오버라이드 및 오버로드를 학습했습니다. 여기 내가하고 싶은 것은 과부하를 구현하는 것입니다. 그러나 컴파일러는 d.speak (3)이 잘못되었음을 보여줍니다.자바에서 상속 할 때 오버로드 오류가 발생합니까?

나는 개가 동물을 물려 받았다고 생각한다. 그래서 speak() 함수가 있습니다. 그리고 과부하에 speak (int)를 추가합니다. 내가 왜 틀린거야? 고마워.

답변

2

그것을 Animal 클래스는 그와 speak 방법이 없기 때문이다 서명 (int 파라미터를 취함). 따라서 컴파일러는 Animal 클래스에서 정의를 찾을 수 없습니다. 당신은

Animal d = new Dog(); 
((Dog)d).speak(3); 

편집처럼, 그것을 전에 다운 캐스트 할 수 있습니다 Reimeus 제안 등의 개로서 직접 선언하거나.

+0

따라서 다형성을 구현하려면 우선 상속 트리에 동일한 서명이 있는지 확인해야합니다. 아니면 적절한 데이터 유형으로 '변환'해야합니까? – AlexWei

+0

@AlexWei 다형성은 동일한 서명과 함께 적용됩니다. 따라서 메서드 인터페이스 (이름, 반환 형식 및 매개 변수 이름 및 형식으로 제공)가 계층 구조의 클래스에서 동일하면 기본 클래스 (이 경우 Animal)에 대한 포인터에서 해당 메서드를 호출하면 런타임에서 인스턴스의 실제 클래스 (이 경우 Dog)에서 메소드를 호출하십시오. –

4

int 인수가 Dog 일 수 있습니다. speak입니다. 당신이 캐스팅없이 Animalspeak를 호출 할 경우

Dog dog = new Dog(); 
dog.speak(3); 

은 다음 인수 목록은 모든 개체에 대해 동일 할 필요가

0

동물의 참조와 개의 참조를 사용하고 있습니다.
재정의 된 메서드의 경우 참조 된 클래스에서 사용할 수있는 메서드를 가리 킵니다.
동물 클래스의 speak() 메소드가 가리키는 클래스는 참조 된 클래스이기 때문입니다.
따라서 매개 변수 화 된 speak (int a) 메서드를 찾을 수 없습니다.

//Points to speak() of Animal 
Animal a=new Animal(); 
a.speak(); 

//Points to speak(int) of Dog class 
Dog d=new Dog(); 
d.speak(3); 

//Points to speak() of Animal class 
Animal d=new Dog(); 
d.speak(3); //Results in compilation error as speak(int) is not available with Animal reference 

이 상황을 객체 지향 프로그래밍 용어로 SubClass 객체에 대한 SuperClass 참조라고합니다.

0

speak 메서드를 Dog에 오버로드하고 있습니다. 그리고 Java는 오버로드 된 메서드에 대해 정적 바인딩을 사용합니다. 즉, 선언 된 형식에 오버로드 된 메서드가 있어야합니다. 귀하의 경우 Animal은 신고 된 유형이지만 speak(int a)은 없습니다. 그 이유는 그것을 캐스팅해야합니다 : ((Dog)d).speak(3) 컴파일러가 불평을 멈추게 만듭니다.

+0

방금 ​​대답에'정적 바인딩 '을 검색했습니다. 정말 도움이됩니다. – AlexWei

관련 문제