이것은 가장 좋아하는 인터뷰 질문 입니다. 이 질문을 통해 면접관은 생성자, 메서드, 클래스 변수 (정적 변수) 및 인스턴스 변수와 관련하여 개체의 동작을 얼마나 잘 이해하는지 알아 봅니다.
import java.util.ArrayList;
import java.util.List;
class Test {
private final List foo;
public Test() {
foo = new ArrayList();
foo.add("foo"); // Modification-1
}
public void setFoo(List foo) {
//this.foo = foo; Results in compile time error.
}
}
위의 경우 'Test'에 대한 생성자를 정의하고 'setFoo'메소드를 제공했습니다.
생성자 정보 : 생성자는 키워드 를 사용하여 객체 생성 당 한 번만 호출 할 수 있습니다 new
. 생성자는 그렇게 설계되지 않았으므로 생성자를 여러 번 호출 할 수 없습니다.
메소드 정보 : 메소드는 원하는 횟수만큼 호출 할 수 있으며 (아직도) 컴파일러가 알고 있습니다.
시나리오 1
private final List foo; // 1
foo
이다 인스턴스 변수. Test
클래스 객체를 만들면 인스턴스 변수 foo
가 Test
클래스 의 객체 내부에 복사됩니다 . foo
생성자 내부에 할당 하면 컴파일러는 생성자가 한 번만 호출된다는 것을 알고 있으므로 생성자 내부에 할당하는 데 아무런 문제가 없습니다.
메서드 내부에
할당 foo
하면 컴파일러는 메서드를 여러 번 호출 할 수 있다는 것을 알고 있습니다. 즉, 값을 여러 번 변경해야하므로 final
변수에 사용할 수 없습니다 . 그래서 컴파일러는 생성자가 좋은 선택이라고 결정합니다! 최종 변수에는 한 번만 값을 지정할 수 있습니다.
시나리오 2
private static final List foo = new ArrayList();
foo
이제 정적 변수입니다. Test
클래스 의 인스턴스를 만들면 정적 foo
이므로 객체에 복사되지 않습니다 foo
. 이제는 foo
각 객체의 독립적 인 속성이 아닙니다. 이것은 Test
클래스 의 속성입니다 . 그러나 foo
여러 객체와 new
키워드를 사용하여 생성 된 모든 객체가 Test
여러 객체 생성시 값을 변경하는 생성자를 호출하는 경우 ( static foo
모든 객체에 복사되지는 않지만 여러 객체간에 공유 됨) .)
시나리오 3
t.foo.add("bar"); // Modification-2
위 Modification-2
의 질문에서입니다. 위의 경우 첫 번째 참조 객체를 변경하지 않고 foo
허용되는 내용을 추가합니다 . 참조 변수에 a new ArrayList()
를 할당하려고하면 컴파일러가 불평 foo
합니다.
규칙final
변수를 초기화 한 경우 다른 개체를 참조하도록 변수를 변경할 수 없습니다. (이 경우 ArrayList
)
최종 클래스는 서브 클래 싱 될 수 없습니다.
최종 메소드는 재정의 될 수 없습니다. (이 메소드는 수퍼 클래스에 있습니다. )
final 메소드는 재정의 할 수 있습니다. 문법적으로 읽습니다.이 방법은 서브 클래스에 있습니다.