클래스 로딩
수업 초기화에 대해 이야기하기 전에 클래스의 로딩 순서를 설명해 봅시다.
다음은 "Java 4의 생각"에서 발췌 한 것입니다.
Java의 모든 것이 대상이기 때문에 많은 활동입니다
이 문제는 더 간단한 예 중 하나입니다. 다음 장에서 언급 될 바와 같이, 각 객체에 대한 코드는 별도의 파일에 존재합니다. 코드가 실제로 필요하지 않으면 해당 파일이로드되지 않습니다. 일반적으로 해당 클래스의 객체가 구성되지 않으면 코드가 실제로로드되지 않을 것이라고 생각할 수 있습니다. 정적 방법에는 미묘한 모호성이 있기 때문에 "클래스 코드는 처음으로 사용될 때로드됩니다"라고 생각할 수 있습니다.
처음 사용하면 정적 초기화가 발생하는 곳이기도합니다. 로드 할 때 모든 정적 객체 및 정적 코드 블록은 원래 순서 (즉, 클래스 정의 코드에 기록 된 순서)로 초기화됩니다. 물론 정적 데이터는 한 번만 초기화됩니다.
간단히 말해서, 클래스에 상속 관계가있을 때, 클래스 로더는 뒤로 형성되고 관련 클래스를로드합니다.
예를 들어:
클래스 B는 우리가 새로운 b ()를 때 클래스 A를 확장합니다. 클래스 로더는 A의 코드를 자동으로로드합니다.
클래스의 초기화 순서
일반적으로 초기화 순서는 다음과 같습니다.
(정적 객체 및 정적 코드 블록, 순서대로 초기화)> 멤버 변수> 생성자
테스트 코드
public classinit { / ** * @title : main * @description : 클래스 초기화 순서 테스트 * @param : @param args * @return : void * @throws * / public static void main (string [] args) {// a auto-regended method stub new b (); }} class a {static {System.out.println ( "A의 정적 코드 블록 ..."); } public String s1 = prtstring ( "A의 멤버 변수 ..."); public static string s2 = prtstring ( "A의 정적 변수 ..."); public a () {system.out.println ( "A의 생성자 ..."); } public static string prtstring (String str) {System.out.println (str); 널 리턴; }} 클래스 B는 a {public String ss1 = prtstring ( "b의 멤버 변수 ...")을 확장합니다. public static string ss2 = prtstring ( "B의 정적 변수 ..."); public b () {System.out.println ( "B의 생성자 ..."); } private static a a = new a (); static {system.out.println ( "B의 정적 코드 블록 ..."); } {system.out.println ( "코드 블록 ..."); }} 테스트 결과
A의 정적 코드 블록 ...
A의 정적 변수 ...
B의 정적 변수 ...
멤버 변수 ...
A의 생성자 ...
B의 정적 코드 블록 ...
멤버 변수 ...
A의 생성자 ...
B의 멤버 변수 ...
코드 블록 ...
B의 생성자 ...
요약
위는 Java에서 클래스의 초기화 순서의 전체 내용입니다. Java를 사용하는 모든 사람에게 도움이되기를 바랍니다.