java 기초--클래스의 초기화 순서

7027 단어 java 기초
얕은 것부터 깊은 것까지 먼저 한 종류의 초기화와 관련된 쌀이 무엇인지 살펴보자.
정적 구성원 변수, 정적 코드 블록, 일반 구성원 변수, 일반 코드 블록, 구조기.(멤버 방법? 초기화와 아무 상관이 없는 것 같다)
이제 그녀들의 초기화 순서를 살펴보자.
성질적으로 정태는 하나의 유형의 속성을 대표하고 일반적인 것은 하나의 대상의 속성이다.'가죽이 존재하지 않으면 털이 어디에 붙을까'. 유형이 없으면 대상을 말할 수 없기 때문에 정태는 반드시 먼저 초기화해야 한다.
그러면 정적 구성원 변수와 정적 코드 블록 사이에는 또 어떤 관계가 있습니까?
실험을 해보니 정적 구성원 변수와 정적 코드 블록을 앞에 둔 사람이 먼저 실행하는 것을 발견했다. 하지만!!!주의!!!!여기서 말하는 것은'집행'이란 sx=10을 sx에 부여하는 것이지 sx의 초기화가 아니다. 실험2에서 코드 블록에서 인터럽트를 하면 이때 sx가 0으로 초기화되었다는 것을 알 수 있다. 여기서 나는 이렇게 이해한다. 이 클래스(또는 대상)의 구성원을 초기화한 이상 메모리를 분배해 주었다는 뜻이다. int가 메모리를 분배한 후 기본값은 0(기초 유형의 기본값은false, 0,null)이다.이렇게 이해하는 게 맞는지 모르겠어요.그래서 최종 결론은 먼저 구성원 변수를 기본값으로 초기화한 다음에 구성원 변수와 코드 블록의 선후 순서에 따라 더욱 초기화하는 것이다.
실험 코드는 다음과 같습니다.
// 1
private
static int sx = 10; static{ System.out.println("execute static block"); }
// 2
static{ System.out.println("execute static block"); } private static int sx = 10;

이어 일반 구성원 변수와 일반 코드 블록과 정태의 이치는 누설되지 않았다.
그렇다면 구조기와 일반 구성원 변수와 일반 코드 블록의 관계는?
이것은 내가 실험을 통해 이러한 결론을 얻은 것이다. 구성원 변수의'=xxx'(구성원 변수와 기본값 구분으로 초기화)와 코드 블록이 먼저 실행된 다음에 구조기에서 실행된 것이다.(실험 코드를 마지막으로 함께 붙인다)
 
 
ok 여기까지, 하나의 종류는 우리가 간단하게 말했습니다. 그러면 종류는 계승도 있습니다. 자류와 부류가 결합될 때 또 어떤 순서입니까?
사실은 매우 간단하다. 자류는 부류에서 계승되고 부류의 비private 구성원을 사용할 수 있기 때문에 자류를 초기화하기 전에 부류를 초기화해야 한다.
 
 
최종 순서는 다음과 같습니다.
상위 정적 구성원 변수를 기본값으로 초기화 ->
하위 클래스 정적 구성원 변수를 기본값으로 초기화 ->
상위 클래스에서 정적 구성원 변수의 "=xxx"및 정적 코드 블록을 나타나는 순서대로 실행->
하위 클래스의 정적 구성원 변수가 나타나는 순서대로 "=xxx"및 정적 코드 블록 실행->
상위 일반 구성원 변수를 기본값으로 초기화 ->
하위 클래스 일반 구성원 변수를 기본값으로 초기화 ->
상위 클래스는 일반 구성원 변수의 "=xxx"및 정적 코드 블록을 나타나는 순서대로 실행합니다->
상위 클래스 실행 구조 함수 ->
하위 클래스에서 일반 구성원 변수의 "=xxx"및 정적 코드 블록을 나타나는 순서대로 실행->
하위 클래스 실행 구조 함수 ->end
 
실험 코드:
package abstractClass;



@SuppressWarnings("unused")

abstract class AbstractDemo {

    {

        System.out.println("execute super block,this.x="+this.x);

    }

    static{

        System.out.println("execute static super block,this.sx="+AbstractDemo.sx);

    }

    public static int SuperPS = 1;

    private static int sx = 1;

    private int x = 1;



    public AbstractDemo(){

        super();

        System.out.println("execute super constractor");

//        this.print();

    }

    

    public abstract void print();

}



@SuppressWarnings("unused")

class DemoImpl extends AbstractDemo{

    public static int PS = 10;

    private static int sx = 10;

    private int x = 10;   // , super() , 

    {

        System.out.println("execute block,this.x="+this.x);

    }

    static{

        System.out.println("execute static block,this.sx="+DemoImpl.sx);

    }

    public DemoImpl(int x){

        super();  // 

        System.out.println("execute constractor");

        System.out.println("before init in constractor this.x="+this.x);

        this.x = x;

    }

    

    @Override 

    public void print(){

        System.out.println("this.x="+x);

    }

}



public class TestAbstractDemo{

    public static void main(String[] args) {

        new DemoImpl(100);

    }

}

실험 결과:
execute static super block,this.sx=0execute static block,this.sx=10execute super block,this.x=0execute super constractorexecute block,this.x=10execute constractorbefore init in constractor this.x=10

좋은 웹페이지 즐겨찾기