2017-04-18 8 views
-1

동적 메서드 바인딩 수퍼 클래스 참조는 상속되고 오버로드 된 하위 클래스 메서드 만 호출 할 수 있습니다. 그러나 그렇지 않으면 구현 될 수 있습니다. 여기슈퍼 클래스 개체가 상속되지 않은 하위 클래스 멤버 메서드를 참조 할 수 있습니까?

abstract class in 
{ 
    abstract void print(); 
} 
class a extends in 
{ 
    String name=this.getClass().getSimpleName(); 
    void show() 
    { 
     System.out.println("class "+name); 
    } 
    void print() 
    { 
     show(); 
    } 
} 
class Main 
{ 
    public static void main(String args[]) 
    { 
     in x; 
     x = new a(); 
     x.print(); 
    } 
} 

, 그것은 로 슈퍼 클래스 이름 대신 서브 클래스의 이름을 반환

또한 getClass()가있는 슈퍼 클래스 객체를 참조

클래스 성공적으로 인쇄 주요 방법.

+3

부모님은 자녀에 대해 알 수 없습니다. 클래스 개발자는 사용자가 클래스를 확장하는 방법을 알 수 없습니다. – duffymo

+0

'in'은'print()'라는 메서드를 가져야한다는 것을 알고 있습니다. 이 메소드의 모든 구현은'a' 내부에서 일어나며,'a'에 대한 모든 것을 알고 있습니다 (클래스 이름과 다른 메소드까지). – khelwood

+0

x.print()는 new a()와 같습니다. print()? 하지만 x가 수퍼 클래스 참조가 아닌가? – ZEU5

답변

0

상위 개체 참조는 클래스 정의에있는 메서드로 제한됩니다. 이러한 메소드가 서브 클래스에 의해 오버라이드 (override)되고 실행시에, 부모 참조에 의해 참조되는 실제의 객체가 서브 클래스 형의 경우, 오버라이드 (override) 된 메소드가 불려갑니다. 재정의 된 메서드가 원래 부모 클래스에 없거나 부모 클래스에없는 변수에 액세스하는 메서드를 호출하면 문제가되지 않습니다.

이것은 다형성에 관한 모든 것입니다. 부모 클래스가 특정 메소드의 정확한 구현을 알 필요가 없으며 하위 클래스가 구현 한 것을 일종의 계약으로 만들 수있는 다른 특정 상속 계층 구조가있는 경우 프로그램 확장을 쉽게하기 때문에 의도적으로이 방법을 사용합니다. .

+0

감사합니다. 유일한 도움이되는 대답이었습니다. :-) – ZEU5

0

미래는 미래에 다른 개발자가 자신의 클래스 A.java 확장에 포함 할 수 방법의 이름이나 서명을 예측할 수 없다 클래스 A.java 오늘을 작성하는 개발자 알 수 없습니다. 또한 이러한 클래스는 각각 별도의 메서드가있는 수많은있을 수 있습니다.

기본 클래스는 하위 클래스와 절대로 결합되어서는 안됩니다. 하위 클래스가 어떻게 구현되는지는 신경 쓰지 않아야합니다.

하위 클래스 중 하나에 정의 된 메서드를 호출하려는 경우에도 권장하지 않지만 다음과 같이 을 입력하여 수행 할 수 있습니다.

public class Parent { 
    public class someMethod(){ 
      if(this instanceof Child1){ 
       ((Child1)this).someAdditionalMethod(); 
      } 
    } 
} 

public class Child1 extends Parent{ 
    public class someAdditionalMethod(){ 

    } 
}