구조 함수, 구조 코드 블록 부분 견해

8511 단어

구조 함수, 구조 코드 블록 부분 견해


어제 시스템은 구조 함수, 구조 코드 블록에 대한 지식을 배웠고, 지금은 배운 지식을 정리했다. 우선 이 부분의 코드를 먼저 보자.
package com.imooc.concurrent;

public class Demo1 {


    public Demo1() {
        // TODO Auto-generated constructor stub
        i=30000;
    }
    int i =10000;
    public static void main(String[] args) {
        Demo1 d1 =new Demo1();
        Demo1 d2 =new Demo1();
        Demo1 d3 =new Demo1();
        System.out.println(d1.i);


    }

}

위 코드에서 보듯이 제 첫 번째 반응은 오류가 발생할 수 있지만 프로그램이 실행된 결과는 30000입니다. 저희는 코드에 대한 역컴파일(역컴파일 명령(jdk8.0 버전):javap -l -c -p Demo1)을 통해 실행 결과는
Compiled from "Demo1.java"
public class com.imooc.concurrent.Demo1 {
  int i;

  public com.imooc.concurrent.Demo1();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."":()V
       4: aload_0
       5: sipush        10000
       8: putfield      #2                  // Field i:I
      11: aload_0
      12: sipush        30000
      15: putfield      #2                  // Field i:I
      18: return
    LineNumberTable:
      line 5: 0
      line 9: 4
      line 7: 11
      line 8: 18
 }

우리는 프로그램이 먼저 성명 부수문구인 int i = 10000을 실행한 것을 발견했다. 이어서 아래의 코드를 다시 보았다
package com.imooc.concurrent;

public class Demo1 {

    public Demo1() {
        i=30000;
    }
    int i =10000;
    {
        i=20000;
    }
    public static void main(String[] args) {
        Demo1 d1 =new Demo1();
        Demo1 d2 =new Demo1();
        Demo1 d3 =new Demo1();
        System.out.println(d1.i);

    }

}

역컴파일 결과:
Compiled from "Demo1.java"
public class com.imooc.concurrent.Demo1 {
  int i;

  public com.imooc.concurrent.Demo1();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."":()V
       4: aload_0
       5: sipush        10000
       8: putfield      #2                  // Field i:I
      11: aload_0
      12: sipush        20000
      15: putfield      #2                  // Field i:I
      18: aload_0
      19: sipush        30000
      22: putfield      #2                  // Field i:I
      25: return
    LineNumberTable:
      line 5: 0
      line 8: 4
      line 10: 11
      line 6: 18
      line 7: 25

우리는 위의 실례를 통해 구조 함수가 존재할 때 초기 부수 변수가 처음으로 실행된다는 것을 발견했다. 이 초기 부수 문장을 어디에 두든지 구조 함수는 항상 마지막으로 실행된다. 당신이 이 함수를 어디에 두든지 다음에 현식 구조 함수를 제거한 후에 우리는 아래의 코드를 본다.
public class Demo1 {

    {
        i=20000;
    }
    int i =10000;
    public static void main(String[] args) {
        Demo1 d1 =new Demo1();
        Demo1 d2 =new Demo1();
        Demo1 d3 =new Demo1();
        System.out.println(d1.i);

    }

}

프로그램이 실행된 결과는 10000입니다. 우리는 역컴파일을 거친 후
Compiled from "Demo1.java"
public class com.imooc.concurrent.Demo1 {
  int i;

  public com.imooc.concurrent.Demo1();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."":()V
       4: aload_0
       5: sipush        20000
       8: putfield      #2                  // Field i:I
      11: aload_0
      12: sipush        10000
      15: putfield      #2                  // Field i:I
      18: return
    LineNumberTable:
      line 3: 0
      line 10: 4
      line 12: 11

우리는 프로그램이 순서대로 집행되는 것을 발견했기 때문에 현식 구조 함수가 존재하지 않을 때 우리의 프로그램은 순서대로 집행된다.

총결산

  • 1.현식 구조 함수, 구조 코드 블록, 성명식 값 부여 문장이 존재할 때 프로그램은 기본적으로 먼저 성명식 값 부여 문장을 실행하고 마지막에 구조 함수를 실행한다
  • 2.현식 구조 함수가 존재하지 않을 때 프로그램은 순서대로 실행된다
  • 비고

  • java에서 매번 new 대상이 있을 때마다 구조 코드 블록이 존재하면 기본적으로 구조 코드 블록과 구조 함수를 한 번 실행한다
  • 좋은 웹페이지 즐겨찾기