2012년 10월 17일 수요일

OCJP 문제풀이 - Question 18


QUESTION 18
Given:

class Super {
  private int a;
  protected Super(int a) { this.a = a; }
}
class Sub extends Super {
  public Sub(int a) { super(a); }
  public Sub() { this.a = 5; }
}

Which two, independently, will allow Sub to compile? (Choose two.)

A. Change line 2 to:
public int a;
B. Change line 2 to:
protected int a;
C. Change line 13 to:
public Sub() { this(5); }
D. Change line 13 to:
public Sub() { super(5); }
E. Change line 13 to:
public Sub() { super(a); }

Answer: CD
Section: All

Explanation/Reference:

현재 이 코드드의 문제는, new Sub() 하고 인스턴스를 생성시, 자동으로
부모의 매개변수 없는 생성자를 실행하게되는데, 현재 Super 클래스에는
매개변수 없는 생성자가 존재하지 않는다. 그래서 에러가 생기는 건데...

이를 해결하기 위해서는 13 라인에서 super([int 매개변수]) 를 삽입하여
자동으로 기본부모생성자가 실행되는 것을 막거나, Super 클래스에 Super() 생성자를
삽입하면 된다.

여기서 C의 경우는 부모생성자를 명시하여 호출하고 있는 자신의 생성자를 호출하여
자동으로 기본 부모생성자가 생성되는 것을 막았고, D는 직접 부모생성자를 명시하여
자동으로 기본 부모생성자가 생성되는 것을 막았다.

또 다른 해결방법은 Super 클래스에 Super() 생성자를 삽입하여, 기본부모생성자가
자동으로 실행되도 정상적으로 작동하도록 하는 방법도 있다.

블로그 보관함