programing tip

정적 방식으로 개체 만들기

itbloger 2020. 11. 8. 09:33
반응형

정적 방식으로 개체 만들기


누구든지 Java가이 코드를 실행하는 방법을 설명 할 수 있습니까? 각 문을 실행하는 순서를 의미합니다.

public class Foo
{
    boolean flag = sFlag;
    static Foo foo = new Foo();
    static boolean sFlag = true;

    public static void main(String[] args)
    {
        System.out.println(foo.flag);
    }
}

산출:

false

  • 클래스 초기화가 시작됩니다. 처음에는 foonull이고 sFlagfalse입니다.
  • 첫 번째 정적 변수 이니셜 라이저 ( foo)는 다음을 실행합니다.
    • 의 새 인스턴스 Foo가 생성되었습니다.
    • flag실행을 위한 인스턴스 변수 이니셜 라이저 -현재 sFlag는 false이므로의 값 flag은 false입니다.
  • 두 번째 정적 변수 이니셜 라이저 ( sFlag)가 실행되어 값을 true로 설정합니다.
  • 클래스 초기화 완료
  • main실행, 인쇄 foo.flag, 이는 거짓입니다.

sFlag로 선언 된 경우 컴파일 타임 상수final 로 처리되며 ,이 시점에서 이에 대한 모든 참조는 기본적으로에 인라인 되므로 사실도 마찬가지입니다.truefoo.flag


foo 클래스의 정적 초기화 중 및 sFlag가 초기화되기 전에 인스턴스화되며 부울의 기본값은 false입니다.

  1. 클래스가로드되었습니다.
  2. Foo는 인스턴스로 초기화됩니다.

    2.a 인스턴스 멤버 플래그는 false기본적 으로 sFlag의 값으로 초기화됩니다.

  3. sFlag가 true 로 초기화됩니다.

자세한 내용은 JLS §12.4 를 참조하십시오.


클래스가로드 sFlag되고 foo필드가 초기화되지만 foo먼저 초기화 될 때 !
필드 flag이고 sFlag부울이며 null 일 수 없으므로 기본적으로 false가 있고 초기화 sFlag될 때 여전히 false foo입니다. flag = sFlag이것이 flag거짓입니다.


초기화 작업의 일반적인 순서는 다음과 같습니다 (클래스가로드 된 후 처음 사용되기 전).

  1. 코드에 나타나는 순서대로 정적 (클래스) 코드 블록,
  2. 코드에 나타나는 순서대로 개체 코드 블록 (초기화 블록 및 할당).
  3. 생성자

확실히 나는 생성자와 함수 본문을 코드 블록 으로 언급하지 않습니다 .

나는 final static들판 에 대해 모른다 . static필드 규칙을 따르고 컴파일 단계에서 초기화 된 이전 주석에도 불구하고 선언 전에 참조 할 수없는 것 같습니다. 컴파일 오류가 발생하기 전에 참조되는 경우 :

Example.java:8: illegal forward reference
        System.err.println("1st static block j=" + j);

아마 final static필드는 초기화 클래스 파일로 컴파일하지만, 이것은 일반적 아니며, 그들은 여전히 선언하기 전에 참조 할 수 없습니다 수 있습니다.

초기화 순서를 확인하는 예제 코드 :

class Example {    

    final static int j = 5;

    {
        System.err.println("1st initializer j=" + j);
    }

    static {
        System.err.println("1st static block j=" + j);
    }

    static {
        System.err.println("2nd static block j=" + j);
    }

    final static java.math.BigInteger i = new java.math.BigInteger("1") {    
        {
            System.err.println("final static anonymous class initializer");
        }
    };

    Example() {
        System.err.println("Constructor");
    }

    static {
        System.err.println("3nd static block j=" + j);
    }

    {
        System.err.println("2nd initializer");
    }

    public static void main(String[] args) {
        System.err.println("The main beginning.");
        Example ex = new Example();
        System.err.println("The main end.");
    } 
}

위의 코드 조각은 다음을 인쇄합니다.

1st static block j=5
2nd static block j=5
final static anonymous class initializer
3nd static block j=5
The main beginning.
1st initializer j=5
2nd initializer
Constructor
The main end.

at first static fields should run and at first inline! so at first line 4 and then 5 will run so foo is initialized first and as we know boolean variables are initialized to false by default so at first so as the foo is initialized the field of flag is sflag that's false and then sfalsg becomes true that won't change flag( there's no relation) then at last main runs and print falg that is false!!! I hope to be useful! Be successful

참고URL : https://stackoverflow.com/questions/10613853/creating-an-object-in-a-static-way

반응형