정적 방식으로 개체 만들기
누구든지 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
- 클래스 초기화가 시작됩니다. 처음에는
foo
null이고sFlag
false입니다. - 첫 번째 정적 변수 이니셜 라이저 (
foo
)는 다음을 실행합니다.- 의 새 인스턴스
Foo
가 생성되었습니다. flag
실행을 위한 인스턴스 변수 이니셜 라이저 -현재sFlag
는 false이므로의 값flag
은 false입니다.
- 의 새 인스턴스
- 두 번째 정적 변수 이니셜 라이저 (
sFlag
)가 실행되어 값을 true로 설정합니다. - 클래스 초기화 완료
main
실행, 인쇄foo.flag
, 이는 거짓입니다.
sFlag
로 선언 된 경우 컴파일 타임 상수final
로 처리되며 ,이 시점에서 이에 대한 모든 참조는 기본적으로에 인라인 되므로 사실도 마찬가지입니다.true
foo.flag
foo
클래스의 정적 초기화 중 및 sFlag가 초기화되기 전에 인스턴스화되며 부울의 기본값은 false입니다.
- 클래스가로드되었습니다.
Foo는 인스턴스로 초기화됩니다.
2.a 인스턴스 멤버 플래그는
false
기본적 으로 sFlag의 값으로 초기화됩니다.- sFlag가 true 로 초기화됩니다.
자세한 내용은 JLS §12.4 를 참조하십시오.
클래스가로드 sFlag
되고 foo
필드가 초기화되지만 foo
먼저 초기화 될 때 !
필드 flag
이고 sFlag
부울이며 null 일 수 없으므로 기본적으로 false가 있고 초기화 sFlag
될 때 여전히 false foo
입니다. flag = sFlag
이것이 flag
거짓입니다.
초기화 작업의 일반적인 순서는 다음과 같습니다 (클래스가로드 된 후 처음 사용되기 전).
- 코드에 나타나는 순서대로 정적 (클래스) 코드 블록,
- 코드에 나타나는 순서대로 개체 코드 블록 (초기화 블록 및 할당).
- 생성자
확실히 나는 생성자와 함수 본문을 위 의 코드 블록 으로 언급하지 않습니다 .
나는 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
'programing tip' 카테고리의 다른 글
Mac OS X Java 업데이트 용 소스 코드 (0) | 2020.11.08 |
---|---|
SSL-CN (일반 이름)과 SAN (주체 대체 이름)은 어떻게 함께 작동합니까? (0) | 2020.11.08 |
파이썬에서 참조로 정수 전달 (0) | 2020.11.08 |
React.js에서 Google 글꼴을 사용하는 방법은 무엇입니까? (0) | 2020.11.08 |
GIL 때문에 다중 스레드 Python 코드에서 잠금이 필요하지 않습니까? (0) | 2020.11.08 |