[Java 학습 노트] 클래스 초기 화 실행 순서
4351 단어 컴퓨터 기반
먼저 클래스 가 JVM 에 불 러 올 지 여부 에 대한 질문: 1. 클래스 의 정적 구성원 이나 정적 함수 가 접근 할 때 클래스 와 기본 클래스 가 불 러 옵 니 다.2. 클래스 가 첫 번 째 로 예화 되 기 전에 클래스 와 그 기본 클래스 가 실 립 니 다.이 이외 의 행 위 는 클래스 의 마 운 트 를 일 으 키 지 않 습 니 다.
클래스 가 불 러 올 때 정적 부분의 초기 화 순 서 는 다음 과 같 습 니 다. 1. 모든 정적 구성원 과 정적 방법 에 메모 리 를 할당 하고 정적 구성원 을 0 또는 null 로 설정 합 니 다.2. 기본 클래스 가 존재 하고 기본 클래스 가 불 러 오지 않 으 면 기본 클래스 에 대해 이 절 차 를 수행 합 니 다.3. 쓰기 순서에 따라 정적 구성원 에 게 초기 값 을 부여 합 니 다.4. 정적 코드 블록 을 실행 합 니 다.
그 다음 에 실례 화 할 때의 초기 화 과정 입 니 다. 1. 클래스 의 모든 구성원 에 게 메모 리 를 분배 하고 값 을 0 또는 null 로 설정 합 니 다.2. 기본 클래스 가 존재 하면 첫 번 째 단계 로 돌아 가 기본 클래스 의 초기 화 를 실행 합 니 다.3. 쓰기 순서에 따라 클래스 의 비정 상 구성원 에 게 초기 값 을 부여 합 니 다.4. 비정 상 코드 블록 을 실행 합 니 다.5. 구조 함 수 를 집행 한다.
기본 클래스 의 정적 방법 은 덮어 쓰 지 않 고 정적 방법 이 덮어 쓰 이지 않 습 니 다.
다음은 실험 코드 입 니 다.
class InitTestBase{
static String name = getName();
static String getName() { return "InitTestBase"; }
static {
System.out.println("InitTestBase loaded.");
System.out.println("Static InitTestBase.name = " + name);
}
protected String state = "Base Initialized";
{
Overrided("InitTestBase");
}
void Overrided(String parent){
System.out.println("InitTestBase.state = \""+state+"\""
+ ", invoked by " + parent);
}
InitTestBase(){
System.out.println("InitTestBase() invoked.");
}
}
class InitTest extends InitTestBase{
static String name = getName();
static String getName() { return "InitTest"; }
static {
System.out.println("InitTest loaded.");
System.out.println("Static InitTest.name = " + name);
}
void Overrided(String parent){
System.out.println("InitTest.state = \""+state+"\""
+ ", invoked by " + parent);
}
protected String state = "Initialized";
{
Overrided("InitTest");
}
InitTest(){
System.out.println("InitTest() invoked.");
}
}
public class Main{
static{
System.out.println("Main loaded.");
}
public static void main(String[] args) {
System.out.println("main() invoked.");
new InitTest();
}
}
실행 결 과 는 다음 과 같 습 니 다.
Main loaded.
main() invoked.
InitTestBase loaded.
Static InitTestBase.name = InitTestBase
InitTest loaded.
Static InitTest.name = InitTest
InitTest.state = "null", invoked by InitTestBase
InitTestBase() invoked.
InitTest.state = "Initialized", invoked by InitTest
InitTest() invoked.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
URL 입력에서 페이지 보이기까지3. 브라우저가 웹 서버에 HTTP 요청을 보낸다. 1. 사용자가 사이트 주소를 입력하고 브라우저가 DNS 조회를 시작하여 사용자에게 웹 페이지를 방문하도록 요청하면 DNS 서버(도메인 이름 해석 시스템)는 사용자가...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.