2013-01-24 2 views
0

는 :상속 및 개인 방법 다음 코드 블록을 감안할 때

public class Trial { 
    public static void main (String[] args){ 
     B obj = new B(); 
     obj.doMethod(); #prints "From A". 
    } 
} 

class A { 
    private void method(){System.out.print("from A");} 
    public void doMethod(){method();} 
} 

class B extends A { 
    public void method(){System.out.print("from B");} 
    public void doMethod(){super.doMethod();} 
} 

는 클래스 A의 방법()가 호출되는 것으로 나타났다. 왜 이런거야?

답변

2

이렇게 명시 적으로 구현합니다. A

public void doMethod(){super.doMethod();} 

입니다 기본 클래스에서 super 호출 방법은 그래서 메소드 체인은 다음과 같이이다 : 아래를 참조

B.doMethod() -> A.doMethod() -> A.method() -> "from A" 
+0

미안. 클래스 A의 method()가 호출 된 이유를 묻는 것. –

+0

@ VictorCheung, 업데이트를 참조하십시오. –

0

때문에 다음은 클래스 B의 doMethod에서

class B extends A { 
    public void method(){System.out.print("from B");} 
    public void doMethod(){super.doMethod();} 
} 

() 당신은 super.doMethod()를 사용하여 Class A의 doMethod()를 invoiking하고있다. 그래서 분명히 클래스 A의 doMethod()를 인쇄하고 있습니다.

0

수퍼 키워드로 doMethod를 호출합니다. 내가 class Aprivate void method(){System.out.print("from A");}이 비공개로 왜 인쇄가 class B에서 "A에서"경우 귀하의 질문에 생각

1

super keyword에 부모 구현 더 호출하는 것을 의미합니다.

대답은 매우 간단합니다. 다른 클래스에서 A 클래스 양식의 method()을 호출 할 수는 없지만 자체 개체로 호출 할 수는 있습니다.

super.doMethod();으로 전화를 걸면 super의 기능과 method()은 고유 한 방법이므로 호출 할 수 있습니다.

0

코드는 간단한 개체 생성 (B obj = new B();) 및 super를 사용하는 호출을 제공합니다. 슈퍼는 부모 클래스에 언급 된 다른 사람들처럼 사용됩니다. 좀 더 재미있는 일 (A obj = new B();)을 시도하면 상황이 달라졌을 수 있습니다.

0

클래스 A의 메서드()는 비공개이며 비공개 메서드를 재정의 할 수 없습니다. 그리고 오버라이드 할 때 @Override annotion을 사용하는 것이 더 좋습니다.

class B extends A { 

    @Override 
    public void method(){System.out.print("from B");} // Compile error 
} 

정적 메서드로 메서드를 변경하면 비슷한 문제가 발생합니다.

class A { 
    public static void method(){System.out.print("from A");} 
} 

class B extends A { 
    public static void method(){System.out.print("from B");} 
}