2014-04-01 6 views
6

나는 문구가 약간 혼란스럽고 이상하다는 것을 알고있다. 그러나 나와 맺어 라. 다음라는 클래스 ChildBlah (그래서 SuperBlah-Blah-ChildBlah)에 Blah을 상속 Java에서 부모 클래스의 자식 클래스 생성자를 통해 부모 클래스의 수퍼 클래스 생성자를 호출 할 수 있습니까?

SuperBlah라는 클래스를 가지고 말해, 당신은 Blah라는 클래스를 상속. Blah에 생성자가없는 경우 ChildBlah의 생성자에 사용 된 super(); 키워드가 SuperBlah의 생성자라고합니다.

안된다고 대답 한 사람들에게 왜 이것이 효과가 있습니까? Critter 클래스를 확장하는 BlusterBug라는 클래스가 있으며 BlusterBug의 생성자에서 super를 호출합니다. Critter에는 생성자가 없지만 Critter가 확장하는 Class에는 생성자가 있습니다. (의도적으로 클래스의 나머지 코드는 생략했습니다.)

public class BlusterCritter extends Critter { 
    // instance vaiables 
    private int courageFactor; 
    private static final double DARKENING_FACTOR = 0.05; 
    // create a constructor(include what is necesary for parent) 
    public BlusterCritter(int c) 
    { 
     super(); 
     courageFactor = c; 
    } 

그런 다음 Critter 클래스에는 생성자가 없습니다!

public class Critter extends Actor// omitted all the code 
{ 
    /** 
    * A critter acts by getting a list of other actors, processing that list, 
    * getting locations to move to, selecting one of them, and moving to the 
    * selected location. 
    */ 
    public void act() 
    { 
     if (getGrid() == null) 
      return; 
     ArrayList<Actor> actors = getActors(); 
     processActors(actors); 
     ArrayList<Location> moveLocs = getMoveLocations(); 
     Location loc = selectMoveLocation(moveLocs); 
     makeMove(loc); 
    } 

하지만 Actor 클래스에는 생성자가 있습니다.

public class Actor 
{ 
    private Grid<Actor> grid; 
    private Location location; 
    private int direction; 
    private Color color; 

    /** 
    * Constructs a blue actor that is facing north. 
    */ 
    public Actor() 
    { 
     color = Color.BLUE; 
     direction = Location.NORTH; 
     grid = null; 
     location = null; 
    } 

그리고 가장 이상한 부분 은요? 이 프로그램은 완벽하게 작동하며 컴파일러는 오류를 포착하지 않습니다! 어떻게 된 일인가?

+4

이런 종류의 질문은 실제로 print 서술문과 테스트 문으로 클래스를 작성함으로써 가장 잘 대답 할 수 있습니다. 나는 당신이 30 줄 이하의 코드로 답을 얻을 수있을 것이라고 생각합니다. 그리고 많은 세부 사항을 배울 수 있습니다. – merlin2011

+0

** 모든 ** Java 클래스에는 최소한 하나의 생성자가 있습니다. 생성자를 선언하지 않으면 매개 변수를 사용하지 않고'super();'호출 만 포함하는 기본 생성자가 있습니다. –

답변

3

컴파일러는 super()입니다 --that, 그것은 SuperBlah의 생성자를 호출 할 것이다 Blah에 대한 암시 인수 없음의 생성자를 생성합니다. ChildBlah

그래서 생성자 호출되는 '생성자는 super()를 호출, 그것은 SuperBlah이 결과 컴파일러가 Blah 생성이 암시 적 생성자를 호출합니다'. 따라서 어떤 의미에서 귀하의 질문에 대한 대답은 "예"라고 생각합니다.

그러나 이것은 Blah에 생성자가없는 경우에만 작동합니다. (실제 코드에서는 Critter에는 생성자가 없으므로 작동합니다.) Blah에 대해 다른 생성자가 정의되어 있지만 액세스 할 수있는 인수가없는 생성자가없는 경우 암시 적 인자없는 생성자가 없습니다 결과는 컴파일 타임에 오류가됩니다.

+0

자바가 가지고있는 정말 멋진 기능입니다. – user3421796

2

아니요, 그렇지 않습니다. Blah에 암시 적 기본 생성자를 호출합니다.
Blah이 다른 생성자 (매개 변수 포함)를 정의하지만
기본 생성자가없는 경우 컴파일 오류가 발생합니다.

또한 생성자는 상속되지 않습니다.
(질문/생각과 관련이있는 경우).

0

Blah의 생성자를 호출하여 Blah에 생성자가 없으면 컴파일러 오류가 발생합니다.

1

예. Blah에 생성자가 없으면 기본 빈 생성자를 호출하고 transitively 비공 인 SuperBlah 생성자를 호출합니다. Blah 어떤 생성자 이없는 경우

0

아니요. 생성자는 계층 구조의 중간 클래스에 의한 선택적 재 지정과 관련하여 메소드와 유사하지 않습니다. 수퍼 클래스의 인스턴스 메소드가 중간 클래스에 구현되지 않은 경우 super.method()을 통해 서브 클래스에서 메소드를 호출하면 수퍼 클래스 메소드가 호출됩니다. 그러나 계층 구조의 모든 클래스에 대한 생성자를 호출해야합니다. 즉, 중간 클래스의 생성자를 건너 뛸 수 없습니다.

관련 문제