2011-08-10 7 views
3

내 응용 프로그램은 다음과 유사한 구조를가집니다.수퍼 클래스 메서드에서 서브 클래스 메서드를 호출합니까?

class Father{ 
a(){ ... } 

b(){a();} 
} 

class Son extends Father{ 
a(){ ..... }} //override 

b()는 대체되지 않습니다. 아들의 인스턴스를 만들 때 b()를 호출하면 아버지의 a()가 호출됩니다. 그러나이 객체가 아들 (개체가 아들 인 경우)을 실행하려고합니다. 가능한가?

+0

이 상황에서 아들의 a()를 호출해야합니다. –

+0

@Hovercraft, 나는 OP가 b()가 오버라이드되지 않는다고 가정하고 객체가 Son 인 경우 b()가 Son의 a()를 호출하기를 원한다. –

+0

@SamDeHaan : b **는 재정의 할 필요가 없다. * –

답변

4

아들의 a 메서드를 호출해야합니다. 그렇지 않은 경우 Son 인스턴스에서 작업하지 않거나 올바르게 재정의하지 않았습니다. 서명이 정확히 일치하지 않으면 이런 일이 발생할 수 있습니다. 구현시 서명이 정확히 동일하다는 점을 두 번 확인합니다. 또한 Son 구현 위의 @Overridea으로 던져보고 컴파일 오류가 발생하는지 확인하십시오. 그렇게하면 메서드를 올바르게 재정의하지 않습니다. 또한이

class Son extends Father{ 
    @Override 
    a(){ ...} 
} 

처럼

, a이 중 보호되어야한다 또는 공공 (FatherSon는 동일한 패키지에있는 경우 패키지는 개인, 기본 만 작동합니다). 즉 Sona() 메소드를 "볼"수 있어야합니다.

+0

고마워요! 'a()'는'private'이며,'protected'는 작동합니다 :) – supergiox

5

예/아니오

  • 번호 : "나는 아들의 인스턴스를 생성하고 내가) (B를 호출 할 때, 아버지는()가 호출,"그건 잘못이다!
  • 예 : "나는 아들이 (아들이 있다면) 아들을 실행하고 싶습니다. 가능합니까?" - a는, 정적 방법은 아닙니다 다음 dynamic binding을 사용하는 Java, 그래서 아들의 a() 메서드를 호출 할 경우, 즉

자바의 동작입니다.

new Son().b()은 Son에 a() 메서드를 호출합니다. 이를 동적 바인딩이라고합니다.

-1

정확해야합니다. 메소드 호출은 지연 바인딩됩니다. 즉, Son 개체의 어느 곳에서나 a() 메서드를 호출하면 Son 메서드가 호출됩니다.

-1

오버라이드 된 메서드는 런타임에 해석되지만 오버로드 된 메서드는 컴파일 타임에 해결됩니다. 따라서 새로운 Son(). a() 만 호출하면 충분합니다.

관련 문제