중학교 Java 개발자를위한 과제로 제공되는 코드가 있습니다. 나는 5 년 동안 자바를 사용하여이 코드 조각은 날 완전히 혼란 :Java : 객체의 초기화 순서
Hello World!
variable value = null
을하지만 우리는 String variable = null;
String variable;
로 변경하는 경우 우리가해야합니다 :
public class Main {
String variable;
public static void main(String[] args) {
System.out.println("Hello World!");
B b = new B();
}
public Main(){
printVariable();
}
protected void printVariable(){
variable = "variable is initialized in Main Class";
}
}
public class B extends Main {
String variable = null;
public B(){
System.out.println("variable value = " + variable);
}
protected void printVariable(){
variable = "variable is initialized in B Class";
}
}
가 출력 될 것
Hello World!
variable value = variable is initialized in B Class
두 번째 출력이 더 명확합니다. 그래서, 지금까지의 내가 이런 자바 inizialisation의 순서 알고 : 우리는이 루트 상위 클래스에 올 때
- 우리는 (자바 항상 클래스 객체이다) 클래스 계층 구조의 루트로 이동합니다, :
- 모든 정적 데이터 필드가 초기화됩니다.
- 모든 정적 필드 초기화 프로그램과 정적 초기화 블록이 실행됩니다.
- 모든 비 정적 데이터 필드가 초기화됩니다.
- 모든 비 정적 필드 초기화 프로그램과 비 정적 초기화 블록이 실행됩니다.
- 기본 생성자가 실행됩니다.
- 그런 다음 기본 하위 클래스에 대한 절차를 반복합니다.
- : 위의 규칙에 따라
Calling base class overridden function from base class method, 나는이 같은 순서를 가지고 가정 -
- : 위의 규칙에 따라
또한 슈퍼 클래스의 맥락에서 this
키워드의 동작을 설명 포스트가 B
클래스의 새 인스턴스를 만듭니다.
Main
으로갑니다.main.variable
을 초기화합니다.Main
클래스의 기본 생성자로 이동합니다.Main
메서드를 호출합니다. (? 왜 우리는 여기 this
키워드가없는 main.printvariable
를 호출하지 않습니다.)b.variable
B
에 돌아와 "변수가는 B 클래스의 초기화";b.variable
을 초기화해야합니까?B
의 기본 생성자는 사람이 상속 inizialisation 시퀀스가 작동하는 방법의 완전하고 자세한 설명을 제공 할 수 있습니다, 하십시오
String variable = null;
을
String variable;
으로 변경하면 또 다른 결과가 나타납니다.
printVariable을 (고용하지가 있다면 무슨 일이 일어날 지 요청할 수 있습니다) – Jimmt
5 년 동안 Java를 작성해 왔으며 디버거 사용법을 모르십니까? (코드를 단계별로 실행하면 어떤 일이 일어나고 어떤 순서로 진행되는지 정확하게 알 수 있습니다.) –
@BrianRoach 물론 디버거를 사용할 수 있으며 javap -v -c B.class도 시도했습니다. 그러나 자바 개발자 또는 인터뷰 질문에 대한 이러한 작업을 볼 때마다 출력을 예측하고 이해합니다. 왜 이렇게 작동하며 코드를 약간 수정하면 어떻게됩니까? 단계별 실행은 규칙 및 실행 프로세스의 이유를 설명하지 않습니다. – INlHELL