클래스 파일로드 순서
1. 먼저 부모 클래스의 정적 변수 및 정적 초기화 블록을로드합니다 (실행 순서는 순서대로 정렬됩니다).
2.이 클래스를 실행하는 정적 변수 및 정적 초기화 블록을 다시로드하십시오.
클래스가 파괴되지 않는 한, 정적 변수와 정적 초기화 블록은 한 번만 실행되며,이 두 단계는 클래스의 후속 작업에서 더 이상 수행되지 않습니다.
클래스 인스턴스 생성 프로세스
클래스의 인스턴스는 새 메소드가 호출 될 때만 생성됩니다.
1. 위의 클래스 파일을로드하는 순서대로 (클래스가로드 된 경우이 단계를 건너 뜁니다)
2. 부모 클래스의 비 정적 변수 및 비 정적 초기화 블록
3. 부모 클래스의 구성 방법
4.이 클래스의 비 정적 변수 및 비 정적 초기화 블록
5.이 클래스의 구성 방법
4. 클래스 인스턴스를 파괴 할 때 먼저 서브 클래스 부분을 파괴 한 다음 부모 클래스 부분을 파괴하십시오.
정적 방법과 비 정적 방법이 모두 수동적으로 호출됩니다
즉, 시스템은 자동으로 호출 및 실행되지 않습니다. 따라서 사용자는 호출되지 않으면 실행하지 않습니다. 주요 차이점은 정적 메소드가 클래스 이름으로 직접 호출 될 수 있다는 것입니다 (및 인스턴스화 객체도 수행 할 수 있음). 비 정적 메소드는 객체를 인스턴스화 한 후에 만 호출 할 수 있다는 것입니다.
관련 개념
정적 키워드 :
멤버를 수정하는 데 사용되는 수정 자입니다 (회원 변수 및 멤버 함수)
수정 된 멤버는 다음과 같은 특성을 가지고 있습니다.
클래스가로드 될 때로드 (클래스가로드 되 자마자 정적 데이터가 즉시 메모리에 공간을로드합니다).
수업이 사라짐에 따라 사라져 수명주기가 가장 길다는 것을 나타냅니다.
우선적으로 객체 존재에 대한 존재 (물체가 사라지고, 정적은 여전히 존재합니다)
정적 존재 먼저, 객체가 나중에 존재합니다
모든 개체가 공유합니다
메모리 공간을 저장하십시오
멤버가 정적으로 수정되면 객체에 의해 호출되는 것 외에도 클래스 이름으로 직접 호출 할 수도 있습니다.
쓰기 : 수업 이름. 정적 멤버
사용에 대한 메모
정적 메소드는 정적 멤버 만 액세스 할 수 있습니다 (메소드 및 변수)
비 정적 메소드는 정적 및 비 정적으로 액세스 할 수 있습니다
이 키워드와 슈퍼 키워드는 정적 방법으로 작성할 수 없습니다.
객체보다 정적 우선 순위가 있기 때문에 정적 방법으로는 나타날 수 없습니다.
주요 함수는 정적입니다
publicstaticVoidMain (String [] args) {}
언제 정적을 사용해야합니까?
정적 수정의 내용에는 멤버 변수와 함수가 포함되기 때문에 두 가지 측면에서 시작해야합니다.
정적 변수를 정의 할 때 (클래스 변수)
공유 데이터가 객체에 나타나면 데이터가 정적으로 수정됩니다. 객체의 고유 한 데이터는 힙 메모리에 전적으로 존재하지 않는 것으로 정의되어야합니다.
정적 함수를 정의 할 때
비 정적 데이터 (객체 별 데이터)에 내부적으로 액세스하지 않으면 함수는 정적으로 정의 될 수 있습니다.
정적 장단점
이익:
1. 공유 데이터를 개체를위한 별도의 공간에 공유 데이터를 저장하고 공간을 절약하십시오. 각 객체의 사본 하나를 저장할 필요가 없습니다.
2. 클래스 이름으로 직접 호출 할 수 있습니다
단점 :
1. 수명주기가 너무 길다
2. 액세스 제한이 발생합니다 (정적 액세스 만)
메모리 구조
Java 프로그램이 실행될 때는 공간을 메모리에 할당해야합니다. 컴퓨팅 효율을 향상시키기 위해 각 영역에는 특정 데이터 처리 방법 및 메모리 관리 방법이 있기 때문에 공간의 다른 영역이 분할되었습니다.
스택 메모리
데이터가 사용될 때 로컬 변수를 저장하는 데 사용되면 점유 된 공간이 자동으로 해제됩니다.
힙 메모리
배열 및 객체 (엔티티), 새로 생성 된 인스턴스는 힙 메모리에 저장됩니다 (멤버 변수는 객체의 설정으로 설정되며 객체가있는 힙 메모리에 존재 함). 각 엔티티에는 메모리 주소 값이 있습니다 (변수는 주소별로 참조). 엔티티의 변수에는 기본 초기화 값이 있습니다. 엔티티는 더 이상 사용되지 않으며 불확실한 시간 내에 쓰레기 수집기에 의해 재활용됩니다 (가비지 수집 메커니즘).
방법 영역, 로컬 방법 영역, 등록
확인하다
| 로딩 순서 | 부모 클래스 정적 변수 = 1 | 부모 클래스 비 정적 변수 = 1 | 서브 클래스 정적 변수 = 1 | 서브 클래스 비 정적 변수 = 1 |
|---|---|---|---|---|
| [부모 클래스는 부모 클래스 정적 메소드를 호출합니다] | parent.pstaticMethod (); | |||
| 부모 클래스 정적 초기화 블록 1 | 2 | |||
| 학부모 클래스 정적 초기화 블록 2 | 3 | |||
| 부모 클래스 정적 메소드 | 4 | |||
| [서브 클래스 호출 서브 클래스 정적 메소드] | child.cstaticMethod (); | |||
| 서브 클래스 정적 초기화 블록 1 | 5 | 2 | ||
| 서브 클래스 정적 초기화 블록 2 | 6 | 3 | ||
| 서브 클래스 정적 메소드 | 7 | 4 | ||
| 【서브 클래스 인스턴스화】 | 아동 C = 새로운 아동 (); | |||
| 부모 클래스는 비 정적 초기화 블록입니다 | 8 | 2 | ||
| 부모 클래스 비 정적 초기화 블록 2 | 9 | 3 | ||
| 부모 클래스 생성자 | 10 | 4 | ||
| 서브 클래스 비 정적 초기화 블록 1 | 11 | 5 | 5 | 2 |
| 서브 클래스 비 정적 초기화 블록 2 | 12 | 6 | 6 | 3 |
| 서브 클래스 시공 방법 | 13 | 7 | 7 | 4 |
| 【부모 클래스는 서브 클래스 객체를 인스턴스화합니다. | 부모 p = 새로운 자녀 (); | |||
| 부모 클래스는 비 정적 초기화 블록입니다 | 14 | 2 | ||
| 부모 클래스 비 정적 초기화 블록 2 | 15 | 3 | ||
| 부모 클래스 생성자 | 16 | 4 | ||
| 서브 클래스 비 정적 초기화 블록 1 | 17 | 5 | 8 | 2 |
| 서브 클래스 비 정적 초기화 블록 2 | 18 | 6 | 9 | 3 |
| 서브 클래스 시공 방법 | 19 | 7 | 10 | 4 |
| 로딩 순서 | 부모 클래스 정적 변수 = 1 | 부모 클래스 비 정적 변수 = 1 | 서브 클래스 정적 변수 = 1 | 서브 클래스 비 정적 변수 = 1 |
|---|---|---|---|---|
| 【서브 클래스 인스턴스화】 | 아동 C = 새로운 아동 (); | |||
| 부모 클래스 정적 초기화 블록 1 | 2 | |||
| 학부모 클래스 정적 초기화 블록 2 | 3 | |||
| 서브 클래스 정적 초기화 블록 1 | 4 | 2 | ||
| 서브 클래스 정적 초기화 블록 2 | 5 | 3 | ||
| 부모 클래스는 비 정적 초기화 블록입니다 | 6 | 2 | ||
| 부모 클래스 비 정적 초기화 블록 2 | 7 | 3 | ||
| 부모 클래스 생성자 | 8 | 4 | ||
| 서브 클래스 비 정적 초기화 블록 1 | 9 | 5 | 4 | 2 |
| 서브 클래스 비 정적 초기화 블록 2 | 10 | 6 | 5 | 3 |
| 서브 클래스 시공 방법 | 11 | 7 | 6 | 4 |
| 【부모 클래스는 서브 클래스 객체를 인스턴스화합니다. | 부모 p = 새로운 자녀 (); | |||
| 부모 클래스는 비 정적 초기화 블록입니다 | 12 | 2 | ||
| 부모 클래스 비 정적 초기화 블록 2 | 13 | 3 | ||
| 부모 클래스 생성자 | 14 | 4 | ||
| 서브 클래스 비 정적 초기화 블록 1 | 15 | 5 | 7 | 2 |
| 서브 클래스 비 정적 초기화 블록 2 | 16 | 6 | 8 | 3 |
| 서브 클래스 시공 방법 | 17 | 7 | 9 | 4 |
| [부모 클래스는 부모 클래스 정적 메소드를 호출합니다] | parent.pstaticMethod (); | |||
| 부모 클래스 정적 메소드 | 18 | |||
| [서브 클래스 호출 서브 클래스 정적 메소드] | child.cstaticMethod (); | |||
| 서브 클래스 정적 메소드 | 19 | 10 |
public class classtest {public static void main (String args []) {system.out.println ( "【하위 클래스 인스턴스티션】 | child c = new child ();"); 아동 C = 새로운 아동 (); System.out.println ( "【프리미엄 클래스는 서브 클래스 객체를 인스턴스화합니다. | 부모 p = new child ();"); 부모 p = 새로운 자녀 (); System.out.println ( "[프리미엄 클래스는 부모 클래스 정적 메소드를 호출] | parent.pstaticMethod ();"); parent.pstaticMethod (); System.out.println ( "[서브 클래스는 서브 클래스 정적 메소드] | child.cstaticMethod ();"); child.cstaticMethod (); }} 공개 클래스 ClasStest2 {public static void main (String args []) {System.out.println ( "[[[Presiding Class Calls Calling Parent Class Static Method]] | parent.pstaticMethod ();"); parent.pstaticMethod (); System.out.println ( "[[서브 클래스 호출 서브 클래스 정적 메소드] | child.cstaticMethod ();"); child.cstaticMethod (); System.out.println ( "[서브 클래스 인스턴스화] | child c = new child ();"); 아동 C = 새로운 아동 (); System.out.println ( "【부모 클래스는 아동 클래스 객체를 인스턴스화합니다. | 부모 p = new child ();"); 부모 p = 새로운 자녀 (); }} 공개 클래스 부모 {// 상위 클래스 정적 변수 정적 int m = 1; // 부모 클래스 비 정적 변수 int n = 1; // static 문장 블록 1 static {m ++; // j ++; 부모 클래스 비 정적 변수는 정적 명령문 블록 시스템에서 사용할 수 없습니다. } // static statement block 2 static {m ++; System.out.println ( "준비 클래스 정적 초기화 블록 2 |" + m); } // 생성자 public parent () {m ++; n ++; System.out.println ( "준비 클래스 생성자 |" + m + "|" + n); } // 비스틱어 명령문 블록 {m ++; n ++; System.out.println ( "Presiding Class 비 정적 초기화 블록 1 |" + M + "|" + N); } // 비스틱어 명령문 블록 {m ++; n ++; System.out.println ( "Presiding Class 비 정적 초기화 블록 2 |" + M + "|" + N); } // 비 종교적 메소드 public void pmethod () {m ++; n ++; System.out.println ( "Presiding Class Non-Static Method |" + M + "|" + N); 반품; } // 정적 메소드 public static void pstaticMethod () {m ++; // j ++; 부모 클래스 비 정적 변수는 정적 메소드 시스템에서 사용할 수 없습니다. 반품; } @override protected void finalize () 던지기 가능 {super.finalize (); System.out.println ( "부모 클래스 파괴 |"); }} 공개 클래스 아동은 부모 {// 정적 변수 정적 int i = 1; // 비스틱 변수 int j = 1; // static 문장 블록 1 static {m ++; i ++; // j ++; 비 종종 변수는 정적 명령문 블록 시스템에서 사용할 수 없습니다. } // static statement block 2 static {m ++; i ++; System.out.println ( "서브 클래스 정적 초기화 블록 2" + "|" + m + "||" + i); } // 생성자 public child () {m ++; n ++; i ++; J ++; System.out.println ( "서브 클래스 생성자" + "|" + m + "|" + n + "|" + i + "|" + j); } // 비스틱어 명령문 블록 {m ++; n ++; i ++; J ++; System.out.println ( "서브 클래스 비 정적 초기화 블록 One" + "|" + m + "|" + n + "|" + i + "|" + j); } // 비스틱어 명령문 블록 {m ++; n ++; i ++; J ++; System.out.println ( "서브 클래스 비 정적 초기화 블록 2" + "|" + m + "|" + n + "|" + i + "|" + j); } // 비 종교적 메소드 public void pmethod () {m ++; n ++; i ++; J ++; System.out.println ( "서브 클래스는 비 정적 메소드" + "|" + m + "|" + n + "|" + i + "|" + j); 반품; } // static 메소드 public static void pstaticMethod () {// 정적 메소드는 M ++를 상속받을 수 없습니다. i ++; // j ++; 정적 변수는 정적 방법으로 사용할 수 없습니다. } // 비 종교적 메소드 public void cmethod () {m ++; n ++; i ++; J ++; System.out.println ( "서브 클래스 비 정적 메소드" + "|" + m + "|" + n + "|" + i + "|" + j); 반품; } // 정적 메소드 public static void cstaticMethod () {m ++; i ++; // j ++; 정적 변수는 정적 메소드 시스템에서 사용할 수 없습니다. out.println ( "서브 클래스 정적 메소드" + "|" + m + "||" + i); 반품; } @override protected void finalize () 던지기 가능 {super.finalize (); System.out.println ( "하위 클래스 파괴 |"); }}요약
위는 Java의 클래스 로딩 프로세스의 포괄적 인 분석에 대한이 기사의 모든 내용입니다. 모든 사람에게 도움이되기를 바랍니다. 궁금한 점이 있으면 언제든지 메시지를 남길 수 있으며 편집자는 제 시간에 모든 사람에게 답장을합니다. 귀중한 의견을 기대합니다.