사실 작년에 학교 모집 때 접한 알리바바 필기 시험 문제입니다(좀 오래된건 인정합니다 -.-), 뭐 제 기억이 맞다면 자바 방향의 전공 문제였죠. 물론 질문의 의미는 그리 간단하지 않습니다. 프로그램이 실행된 후 모든 System.out.println의 출력 결과를 작성하면 됩니다. 각 System.out.println은 최종 프로그램 출력을 초래합니다. 결과도 다릅니다.
구체적인 질문은 확실히 기억나지 않지만 클래스 A에 정적 변수, 정적 명령문 블록, 비정적 변수, 비정적 명령문 블록, 생성자가 있는 경우 질문을 직접 변경할 수 있습니다. 그리고 클래스 B, 정적 메서드, 비정적 메서드, 그리고 클래스 A는 클래스 B를 상속받습니다. A를 인스턴스화할 때 클래스 내부의 로딩 순서는 어떻게 되나요?
나도 당시에 혼란스러워서 하나 썼다. 나중에 간단한 데모를 통해 클래스 내부의 실제 로딩 순서를 알게 되었습니다.
클래스 B:
public class B{ //静态变量 static int i=1; //静态语句块 static { System.out.println("Class B1:static blocks"+i); } //非静态变量 int j=1; //静态语句块 static{ i++; System.out.println("Class B2:static blocks"+i); } //构造函数 public B(){ i++; j++; System.out.println("constructor B: "+"i="+i+",j="+j); } //非静态语句块 { i++; j++; System.out.println("Class B:common blocks"+"i="+i+",j="+j); } //非静态方法 public void bDisplay(){ i++; System.out.println("Class B:static void bDisplay(): "+"i="+i+",j="+j); return ; } //静态方法 public static void bTest(){ i++; System.out.println("Class B:static void bTest(): "+"i="+i); return ; } }
클래스 A:
public class A extends B{ //静态变量 static int i=1; //静态语句块 static { System.out.println("Class A1:static blocks"+i); } //非静态变量 int j=1; //静态语句块 static{ i++; System.out.println("Class A2:static blocks"+i); } //构造函数 public A(){ super(); i++; j++; System.out.println("constructor A: "+"i="+i+",j="+j); } //非静态语句块 { i++; j++; System.out.println("Class A:common blocks"+"i="+i+",j="+j); } //非静态方法 public void aDisplay(){ i++; System.out.println("Class A:static void aDisplay(): "+"i="+i+",j="+j); return ; } //静态方法 public static void aTest(){ i++; System.out.println("Class A:static void aTest(): "+"i="+i); return ; } }
Class ClassLoading:
public class ClassLoading { public static void main (String args[]) { A a=new A(); a.aDisplay(); } }
프로그램의 실행 결과는 다음과 같습니다.
위의 다이어그램을 통해 전체 로딩 과정을 명확하게 볼 수 있습니다. 자바 클래스의.
1. 클래스 A를 로드하려면 먼저 상위 클래스 B(Object)의 정적 변수 및 정적 명령문 블록을 로드하고 실행합니다. (실행 순서는 배열 순서입니다.)
2. 그런 다음 실행 클래스 A의 정적 변수와 정적 문 블록을 로드합니다. (그리고 1단계와 2단계는 한 번만 실행됩니다.)
3. 클래스 A를 인스턴스화해야 하는 경우 먼저 상위 클래스 B의 생성자를 호출하고 상위 클래스 B의 생성자를 호출하기 전에 Non- 부모 클래스 B의 정적 변수 및 비정적 명령문 블록. 마지막으로 초기화를 위해 부모 클래스 B의 생성자를 호출합니다.
4. 그런 다음 클래스 A의 비정적 변수와 비정적 명령문 블록을 순서대로 호출합니다. 마지막으로 초기화를 위해 A의 생성자를 호출합니다. (그리고 3단계와 4단계는 반복될 수 있습니다)
5. 정적 메서드와 비정적 메서드는 모두 수동 호출입니다. 즉, 시스템이 자동으로 호출하여 실행하지 않으므로 사용자가 수행할 때 실행되지 않습니다. 주요 차이점은 정적 메서드는 클래스 이름(또는 인스턴스화된 개체)을 사용하여 직접 호출할 수 있는 반면, 비정적 메서드는 개체가 인스턴스화된 후에만 호출할 수 있다는 것입니다.
알겠습니다. 오늘의 내용은 여기까지입니다. 좋지 않거나 잘못된 부분이 있으면 지적해주시면 수정하겠습니다.
Java 클래스의 로딩 순서 분석(면접 질문에 자주 사용됨)에 대한 더 많은 관련 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!