2013-03-26 3 views
1
class A { 
    void test() { 
    } 
} 

class B extends A { 
    void test() { 
    } 

public static void main(String[] args) 
{ 
B b=new B(); 
//insert code here 
} 
} 
내가 클래스 B의 B 객체 에 대한 클래스 A의 test 메서드를 호출 할 수있는 방법

? 특히 객체 B의는 서브 클래스의 객체에 대해 슈퍼 클래스의 동일한 방법을 사용하는

+6

귀하의 방법은 현재 반환 형식을 가지고 있지 않았고, 클래스 선언을 사용'()'잘못 - 그것은 (물론, 외부 코드없이) 가능한 한 완전한 같은 사례를 만들려고 노력 가치가있다. 그것들을 멋지게 포맷하는 데 약간의 노력을하면 도움이됩니다. 나는 이번에 그걸 고쳤지만 미래의 질문에 더 많은 노력을 기울이십시오. –

+0

나는 다음 번에 그 일을 할 것이지만 나는 개념에 더 관심이있다. –

+0

네,하지만 잘못된 코드는 찾고있는 개념에서 벗어난 것입니다. 그것이 내 요점이다. 사람들이 가능한 한 쉽게 대답 할 수 있도록 질문을하기 위해 노력해야합니다. 당신은 사람들이 당신을 돕기 위해 시간을 보내길 요청하고 있습니다. 당신은 당신의 질문을 표현할 수있는 것에 대해 감사해야합니다. –

답변

14

당신은 외부 B에서 호출 할 수 없습니다 ...하지만 B 내에서 당신은 그것을 호출 할 수 있습니다 :이 B 내에서 모든 코드에서 수행 할 수

super.test(); 

- test() 메서드 자체에있을 필요는 없습니다. 그래서 예를 들면 :

public void foo() { 
    // Call the superclass implementation directly - no logging 
    super.test(); 
} 

@Override void test() { 
    System.out.println("About to call super.test()"); 
    super.test(); 
    System.out.println("Call to super.test() complete"); 
} 

주 당신이 정말로 이 메소드를 오버라이드 (override)하는 것을 의미 않았다 컴파일러를 알려주는 @Override 주석. (메서드 이름에 오타가있을 경우 메서드 이름에 오타가 있으면 빠르게 찾을 수 있습니다.)

B 외부에서 호출 할 수없는 이유는 B 메서드보다 우선합니다. 재정의 목적은 원래의 행동을 대체하는 것입니다. 예를 들어, 매개 변수가있는 메소드에서 B는 수퍼 클래스 구현을 호출하거나 다른 작업을 수행하기 전에 매개 변수로 무언가를 수행하고 (자체 규칙에 따라 유효성을 검사) 수행하고자 할 수 있습니다. 외부 코드가 A의 버전을 호출 할 수 있다면 B의 기대치 (및 캡슐화)를 위반하게됩니다.

+0

오케이, 나는 그것을 시험하려고합니다. 왜 그런 식입니까? –

+0

@LewsTherin : 어느 비트 요? 재정의 하시겠습니까? 핵심은 개체의 동작을 재정의한다는 것입니다. 그것은 당신이 뭔가 다른 것에 던져서 그것을 얻을 수 있다면 그렇게하는 것이 무의미 할 것입니다. 하위 클래스에서는 불쾌 할뿐만 아니라 다형성 그 자체를 제거합니다. 유형을 알지 못하는 채로 InputStream *을 읽을 수 있기를 원하지만 오버 라이딩 된 동작을 계속 가져 오려고합니다. –

+0

Lol 맞아, 방금 3 개 언어로 테스트 했어. 나는 그것에 대해 결코 생각하지 않았다. .. 고마워! –

0

클래스 자체는 오류입니다. 클래스 이름을 정의 할 때 괄호를 추가하지 마십시오. 당신은 두 객체 타입 캐스팅을 사용하거나이 파생 클래스 객체를 사용하여 기본 클래스의 메소드를 호출 할 수 있습니다

class A 
{ 
test() 
{} 
} 

    class B extends A 
    { 
    test() 
    { 
    super.test() // calls the test() method of base class 
    } 
    } 


    B b=new B(); 
+0

나는 생각하고 있었다. 물론 캐스팅도 마찬가지지만, 서브 클래스 변수에 수퍼 클래스를 할당 할 수 있다고는 생각하지 않습니다. –

+0

나는 그것이 효과가있을 것이라고 생각한다. 나는 전에 이것을했다. 하지만 나는 타입 캐스팅을 권장하지 않는다고 생각합니다. – iCode

+0

나는 그것을 시도해도 작동하지 않는다. 함축적 인 타입 캐스트 인'((B) A)'는 의미가 없습니다. –

0

클래스 B의 test 방법에 super.test()를 호출 할 수 있습니다.

b.super.test()

관련 문제