Java의 필드 초기화에 이상한 순서가 있다는 것을 발견했을 때 나는 혼란 스러웠습니다. 초기화() 결과가 필드 초기화를 덮어 씁니다 예제 코드 :처음 사용하기 전에 필드가 초기화되지 않은 이유는 무엇입니까?
public abstract class Parent {
public String parentField = "dupa";
public Parent(){
init(); // uhh, bad practice to call abstract method in a super constructor
}
protected abstract void init();
}
public class Child extends Parent {
public String childField = null; // assigning null is unnecessary, another bad practice
@Override
protected void init(){
childField = "initialized";
System.out.println("After init(): " + childField);
}
}
...
Child child = new Child(); // OUTPUT: After init(): initialized
System.out.println("After all: " + child.childField); // OUTPUT: After all: null
내가 new Child();
를 호출 할 때 실행 순서가 무엇인지 발견
- 부모 필드 초기화하지만 childField이 이미 존재하고 기본 설정되어 있습니다 값 (childField = NULL)
- 상위 생성자 부모 생성자 호출
- 오버라이드 초기화() (CH2 내가이 예 나쁜 관행이 가득 알고 childField = null이 (다시)
- 아이 생성자
: ildField =
이러한 초기화 순서의 목적은 무엇입니까? 필드 이니셜 라이저가 잠재적으로 처음 사용되기 전에 실행되지 않는 이유는 무엇입니까? 필드가 아직 초기화되지 않았 으면 필드를 사용할 수없는 이유는 무엇입니까?
''부모 '에 대한 ctor가 끝나기 전에'childField'가'Child'에서 어떻게 초기화 될까요? –
생성자에서 재정의 할 수있는 메서드를 호출하는 이유는 불완전한 개체가 다른 코드로 누설된다는 점입니다. 마찬가지로, 자식 필드 이니셜 라이저는'super'가 완전히 생성 될 것으로 기대합니다. – 4castle
자식 및 부모 모두에서 params와 함께 생성자를 사용하는 경우 자식 생성자가 자체 생성자 코드보다 먼저 부모를 호출해야합니다. 이런 종류의 질문을 내게 보입니다. – efekctive