>  기사  >  Java  >  Java의 각 멤버 변수의 초기화 프로세스에 대한 간략한 설명

Java의 각 멤버 변수의 초기화 프로세스에 대한 간략한 설명

无忌哥哥
无忌哥哥원래의
2018-07-19 11:48:581633검색

머리말

최근 Thinking in java을 읽으면서 수업의 각 멤버 초기화에 신경 쓴 적이 없습니다. 실수가 있으면 수정해 주세요.

1 . 상속 및 초기화

무슨 일이 일어나고 있는지 전반적으로 파악하려면 상속을 포함한 전체 초기화 프로세스를 이해하는 것이 도움이 됩니다.

Java에서는 각 클래스의 컴파일된 코드가 자체 독립 파일(예: 클래스 파일)에 존재하며, 이는 프로그램 코드가 필요할 때만 로드됩니다. 일반적으로 "클래스의 코드는 처음 사용될 때 로드됩니다."에는 일반적으로 다음 두 가지 상황이 포함됩니다.

  1. 클래스의 첫 번째 객체를 생성할 때

  2. 정적 메서드에 액세스할 때 또는 fields

참고: 클래스를 처음 사용할 때 정적 초기화가 발생하는 곳입니다. 모든 개체와 코드는 작성된 순서대로 초기화됩니다. static으로 정의된 필드는 한 번만 초기화됩니다.

더 이상 헛소리하지 마세요. 자세한 내용은 다음과 같습니다.

public class Base {
    //static字段
    private static int I1 = printInt("Init I1");    //普通字段
    private int i = 11;    
    protected int j;    
    public Base(){
        System.out.println("Base constructor");
        System.out.println("i="+i+" j="+j);
        j = 40;
    }    static int printInt(String str) {
        System.out.println(str);        
        return 10;
    }
}
public class Son extends Base{
    private static int I2 = printInt("Init I2");    
    public Son() {
        System.out.println("Son constructor");
        System.out.println("I2="+I2+" j= "+j);
    }    
    public static void main(String[] args) {
        Son son = new Son();
    }
}

이 코드를 읽은 후 출력이 무엇이라고 생각하시나요?

먼저 답을 제시하고 분석하세요:

Init I1
Init I2
Base constructori=11 j=0Son constructorI2=10 j= 40

분석:

프로그램은 먼저 Son 클래스의 메인 메소드로 시작하므로 로더가 시작되어 Son 컴파일 코드(예: 클래스 파일)를 찾습니다. 로드 프로세스 중에 Son에도 상위 클래스 Base가 있음을 발견하여 Base의 컴파일된 코드를 계속 로드합니다(Base에 여전히 상위 클래스가 있는 경우 계속해서 위쪽으로 실행). 루트 베이스의 정적 필드. 하위 클래스가 기본 클래스에 따라 달라질 수 있기 때문에 클래스가 초기화됩니다. 멤버가 올바르게 초기화될 수 있는지, 그래서 무슨 일이 일어났는지 Init I1, 然后往下到了Son,Son类的static字段初始化,于是发生了Init I2 ,到此所有的必要的类加载完成,可以开始初始化对象。看到Son son = new Son()这行代码,准备调用Son的构造器,我们知道在继承关系中,子类的构造器中会调用super(),当然这里是隐式调用。这样又会回到父类中去,不过在完成构造器之前,父类(Base)中的所有普通字段(即非static字段)都会完成自己的初始化,所以会看到输出i=11 j=0 그리고 하위 클래스(Son)에 왔을 때, 실행 프로세스는 상위 클래스와 동일하며, 먼저 완료됩니다. 일반 필드를 초기화한 다음 생성자 메서드를 호출합니다.

많이 말씀드리지만 전체 과정은 다음과 같습니다.

  1. 프로그램 항목에서 시작하여 클래스를 로드하고(여기서 Z 클래스로 설정) 상속 관계가 있으면 루트 클래스( 여기서 클래스 A를 가정합니다).

  2. 클래스 A의 정적 필드 초기화를 완료하고 클래스 Z를 만날 때까지 아래쪽으로 반복합니다.

  3. 클래스 A의 공통 도메인 초기화를 완료하고, 클래스 A의 생성자를 완료하고, 클래스 Z를 만날 때까지 아래쪽으로 반복합니다.

위 내용은 Java의 각 멤버 변수의 초기화 프로세스에 대한 간략한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.