2016-09-16 5 views
0

여기 내 질문입니다. 나는 그것에 추상적 인 메소드를 가진 수퍼 클래스를 가지고있다.하위 클래스 개체에서 추상 메서드 호출

public abstract class Base{ 

public abstract Boolean foo(); 

} 
public class sub extends Base{ 
@Override 
public Boolean foo(){ 
    System.out.printLn("This is foo in the sub class!"); 
} 
} 

그래서 메인에 가서이 코드

Base b = new sub(); 
b.foo(); 

나는 오류를 가지고하지 않으며 메시지가 내 화면에 표시를하려고하면. 내 가정은 컴파일러가 b ​​객체를보고 기본 객체로보고 기본 객체의 foo로 이동 한 후 구현이 없다는 것을 확인한 후 자식의 foo를 확인한 다음 foo 메소드를 봅니다. 거기 구현 그래서 그것은 메시지를 보여줍니다. 내가 맞습니까?

+0

자료를 컴파일하는 동안 런타임 오브젝트는 하위입니다. 메소드는 런타임 객체에서 호출됩니다. –

+0

[추상 클래스 문서] (http://stackoverflow.com/documentation/java/87/inheritance/397/abstract-classes#t=20160916155332004042)를 참조하십시오. – Jonathan

+1

여러분, 고맙습니다. 그래서 런타임 객체 메소드 foo가 기본 클래스 메소드 인 foo보다 호출되기 때문에 컴파일러는 그것에 대해 불평하지 않습니다. – MohsenFM

답변

1

컴파일러는 표시되지 않는다. 특정 클래스 형식 참조에서 호출 한 메서드가 클래스 자체에 있는지 여부 만 확인합니다. 런타임시 호출 할 메소드가 기본 클래스 버전 또는 하위 클래스 버전을 의미하는지 결정합니다.

그래서 "내 가정은 컴파일러가 b ​​객체를보고 기본 객체로보고 기본 객체의 foo로 이동한다는 것입니다."

1

컴파일러는 그렇게 많은 처리를하지 않습니다. 여기에 귀하의 경우 하위 클래스의 객체를 보유 할 수퍼 클래스로서 참조 변수를 만들었습니다.

이제 메서드를 호출하면 개체 유형에 따라 하위 클래스에있는 메서드를 직접 호출합니다.

참조 용 내 의견이있는 코드를 추가하고 있습니다.

1) 추상 클래스를 갖는 유일한 방법 선언

public abstract class Base { public abstract Boolean foo(); //method declaration }

2) 당신은 당신이 콘크리트로이 클래스를 선언하는 경우, 메소드를 구현해야 할 부모 클래스를 확장 하위 클래스 수업.

public class sub extends Base { @Override public Boolean foo() { System.out.printLn("This is foo in the sub class!"); } }

3)의 객체를 저장하는 부모 유형 자식 클래스

Base b = new sub();

4)이 라인의 다음은 선언 참조 변수 컴파일러가 실행될 것입니다, 객체의 타입은 무엇이며 객체 타입을 기반으로 그 메소드를 호출합니다. 메소드는 메소드를 호출하지 않습니다. 참조 변수 ype. 상기 방법은 서브 클래스 여부 구현된다면

b.foo();

관련 문제