>  기사  >  Java  >  Java는 가상 머신 관점에서 클래스의 인스턴스화 순서가 무엇인지 분석합니다.

Java는 가상 머신 관점에서 클래스의 인스턴스화 순서가 무엇인지 분석합니다.

青灯夜游
青灯夜游앞으로
2018-10-20 15:51:142149검색

이 기사에서 제공하는 내용은 가상 머신의 관점에서 클래스의 인스턴스화 순서에 대한 Java의 분석입니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

1. 먼저 예제 코드(Son.java & Father.java)를 보여줍니다.

public class Father {    
    public static int a=10;//父类的静态变量    static{//父类的静态代码块
        a=20;
    }
    {//父类的构造代码块
        a=30;
    }    
    public Father() {//父类的构造方法
        a=40;
    }
}
public class Son extends Father{    
    public static int s=10;//子类的静态变量    public int k=20;//子类的实例变量    static{//子类的静态代码块
        s=20;
    }
    {//子类的构造代码块
        s=30;
    }    public Son() {//子类的构造函数
        s=40;
    }
    {//子类的构造代码块
        s=50;
    }
}

2. son.java 파일을 son.class 파일로 컴파일한 다음 javap를 사용하여 Son의 바이트코드 명령어를 분석합니다. 로딩 순서는 이해하기 더 쉽습니다(javap -v -c Son > p.txt).

3. "new Son();" 코드를 실행한 후 클래스 로딩 순서를 분석합니다.

아래의 static{};은 함수이고, son()은

static {};
    descriptor: ()V
    flags: ACC_STATIC
    Code:
      stack=1, locals=0, args_size=0
         0: bipush        10
         2: putstatic     #11                 // Field s:I--------------------------顺序执行静态变量的赋值
         5: bipush        20
         7: putstatic     #11                 // Field s:I--------------------------顺序执行静态代码块
        10: return
  public packet1020.Son();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=1, args_size=1
         0: aload_0         
         1: invokespecial #16                 // Method packet1020/Father."<init>":()V--------------------执行父类的<init>函数(顺序不变,第一个)
         4: aload_0         
         5: bipush        20
         7: putfield      #18                 // Field k:I------------------------------------------------按顺序收集实例变量赋值
        10: bipush        30
        12: putstatic     #11                 // Field s:I------------------------------------------------按顺序收集构造代码块
        15: bipush        50
        17: putstatic     #11                 // Field s:I------------------------------------------------按顺序收集构造代码块
        20: bipush        40
        22: putstatic     #11                 // Field s:I------------------------------------------------最后执行自己的构造函数代码(顺序不变,最后一个)
        25: return

분석 시작:

1. 초기화 단계에서 먼저 상위 클래스 를 실행한 다음 정적 변수 할당 및 정적 변수를 실행합니다. 코드 블록 순서대로.

2. 코드에서 생성자가 실행되므로

결론:

1. 정적 변수 할당과 정적 코드 블록은 상위 클래스에서 순차적으로 실행됩니다

2. 정적 변수 할당과 정적 코드 블록은 하위 클래스에서 순차적으로 실행됩니다

3. 상위 클래스 코드 블록

4. 상위 클래스 생성자

5. 하위 클래스에서 인스턴스 변수 할당을 순차적으로 실행하고 코드 블록을 구성합니다.

6. 하위 클래스 생성자

이름 설명: "심층 이해"에서 발췌 Zhou Zhiming 선생님의 "Java Virtual Machine": JVM 고급 기능 및 모범 사례》

1. 클래스를 초기화해야 하는 상황은 4가지뿐입니다( 함수 실행). 세 번째 상황: 클래스를 초기화할 때 클래스의 경우 상위 클래스를 먼저 초기화합니다. 이것이 상위 클래스의 함수가 하위 클래스의 함수보다 먼저 실행되는 이유입니다.

2. 기능: 컴파일러는 클래스의 모든 정적 변수의 할당 동작을 자동으로 수집하고 소스 코드의 순서에 따라 정적 코드 블록의 명령문을 병합합니다.

3. 함수: 처음에 상위 클래스의 함수가 호출되면 컴파일러는 자동으로 클래스의 인스턴스 변수 할당 작업을 수집하고 이에 따라 구성 코드 블록의 명령문을 병합합니다. 소스 코드의 순서에 따라 생성자 메서드 앞에 삽입하고 마지막으로 프로그래머가 직접 작성한 생성자 코드를 삽입합니다.

구성 코드 블록의 실행 순서는 생성자보다 우선합니다.

<init>(){
  1.调用父类<init>方法
  2.顺序执行实例变量的赋值操作和构造代码块
  3.程序员自己的构造函数方法代码
}

요약: 위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되기를 바랍니다. 더 많은 관련 튜토리얼을 보려면 Java 비디오 튜토리얼, Java 개발 그래픽 튜토리얼, bootstrap 비디오 튜토리얼을 방문하세요!

위 내용은 Java는 가상 머신 관점에서 클래스의 인스턴스화 순서가 무엇인지 분석합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제

관련 기사

더보기