정적 변수는 언제 초기화됩니까?
정적 변수가 언제 기본값으로 초기화되는지 궁금합니다.클래스가 로드되면 정적 변수를 만들고(할당), 선언에서 정적 이니셜라이저 및 초기화가 실행되는 것이 맞습니까?기본값은 어느 시점에서 지정됩니까?이는 전방 참조의 문제로 이어집니다.
또한 "왜 정적 필드가 제때 초기화되지 않는가?"라는 질문에 대해 설명해주실 수 있습니까?특히 같은 사이트에서 케빈 브록이 준 답변입니다.세 번째 포인트는 이해가 안 돼요.
- 오브젝트(인스턴스)가 아닌 클래스에 속하는 변수입니다.
- 정적 변수는 실행 시작 시 한 번만 초기화됩니다.이러한 변수는 인스턴스 변수를 초기화하기 전에 먼저 초기화됩니다.
- 클래스의 모든 인스턴스가 공유하는 단일 복사본
- 정적 변수는 클래스 이름으로 직접 액세스할 수 있으며 개체가 필요하지 않습니다.
인스턴스 및 클래스(스태틱) 변수는 의도적으로 초기화할 수 없는 경우 표준 기본값으로 자동으로 초기화됩니다.로컬 변수가 자동으로 초기화되지는 않지만 로컬 변수를 사용하기 전에 로컬 변수를 초기화하거나 해당 로컬 변수에 값을 할당하지 못한 프로그램을 컴파일할 수 없습니다.
컴파일러가 실제로 하는 일은 모든 정적 변수 이니셜라이저와 코드의 모든 정적 이니셜라이저 블록을 클래스 선언에 나타나는 순서대로 조합하는 단일 클래스 초기화 루틴을 내부적으로 생성하는 것입니다.이 단일 초기화 절차는 클래스가 처음 로드될 때 한 번만 자동으로 실행됩니다.
내부 클래스의 경우 정적 필드를 사용할 수 없습니다.
내부 클래스는 명시적으로 또는 암묵적으로 선언되지 않은 중첩된 클래스입니다.
static....
내부 클래스는 스태틱인테셜라이저('8.7) 또는 멤버인터페이스를 선언할 수 없습니다.
내부 클래스는 상수 변수가 아닌 한 정적 멤버를 선언하지 않을 수 있습니다.
"JLS 8.1.3 내부 클래스 및 동봉 인스턴스" 참조
finalJava의 필드는 선언 장소와는 별도로 초기화할 수 있습니다.단, 이는 에 적용할 수 없습니다.static final[ ]를 클릭합니다.아래 예를 참조하십시오.
final class Demo
{
private final int x;
private static final int z; //must be initialized here.
static
{
z = 10; //It can be initialized here.
}
public Demo(int x)
{
this.x=x; //This is possible.
//z=15; compiler-error - can not assign a value to a final variable z
}
}
이것은, 의 카피가 1 개 밖에 없기 때문입니다.static인스턴스 변수와 같이 유형의 각 인스턴스와 관련된 변수가 아니라 유형과 관련된 변수 및 초기화를 시도하는 경우z타입의static final컨스트럭터 내에서, 그것은 재초기화를 시도한다.static final유형 필드z생성자는 정적으로 발생하지 않아야 하는 클래스의 각 인스턴스화에 대해 실행되기 때문입니다.final[ ]를 클릭합니다.
정적 필드는 클래스가 클래스 로더에 의해 로드될 때 초기화됩니다.이때 기본값이 할당됩니다.이것은, 소스 코드에 표시되는 순서보다 높은 순서로 행해집니다.
참조:
특히 마지막에는 스태틱 변수가 초기화되었을 때 어떤 순서로 (주의사항을 포함) 상세하게 설명하는 초기화 절차를 나타냅니다.finalclass 변수 및 컴파일 시간 상수인 인터페이스 필드가 먼저 초기화됩니다.
포인트 3에 대한 당신의 구체적인 질문이 무엇인지 잘 모르겠습니다(네스트된 것을 의미한다고 가정).자세한 시퀀스는 이것이 재귀 초기화 요청이므로 초기화를 계속합니다.
초기화 순서는 다음과 같습니다.
- 정적 초기화 블록
- 인스턴스 초기화 블록
- 컨스트럭터
프로세스의 상세한 것에 대하여는, JVM 사양서를 참조해 주세요.
정적 변수
- 오브젝트(인스턴스)가 아닌 클래스에 속하는 변수입니다.
- 정적 변수는 실행 시작 시(Classloader가 클래스를 처음 로드하는 경우)에 한 번만 초기화됩니다.
- 이러한 변수는 인스턴스 변수를 초기화하기 전에 먼저 초기화됩니다.
- 클래스의 모든 인스턴스가 공유하는 단일 복사본
- 정적 변수는 클래스 이름으로 직접 액세스할 수 있으며 개체가 필요하지 않습니다.
다른 질문의 코드부터 시작합니다.
class MyClass {
private static MyClass myClass = new MyClass();
private static final Object obj = new Object();
public MyClass() {
System.out.println(obj); // will print null once
}
}
이 클래스에 대한 참조가 초기화를 시작합니다.먼저 클래스가 초기화됨으로 표시됩니다.그런 다음 첫 번째 정적 필드가 MyClass()의 새 인스턴스로 초기화됩니다.myClass에는 빈 MyClass 인스턴스에 대한 참조가 즉시 제공됩니다.공간은 있지만 모든 값이 null입니다.이제 생성자가 실행되어 인쇄됩니다.obj(비슷하다)
다시 로 돌아가겠습니다: 제제클클 now now now now now now now 。obj새로운 실물을 참조하면 끝입니다.
이 다음과 같은:MyClass mc = new MyClass();할당됩니다(및 는 "MyClass"에 있습니다).mcobj이 값은 null이 아닙니다.
여기서 진짜 요령이라면, 이 기능을 사용할 때new 」와 WhatEverItIs weii = new WhatEverItIs( p1, p2 ); weii는 즉시 무효 메모리의 비트를 참조합니다.그런 다음 JVM은 값을 초기화하고 생성자를 실행합니다. 어떤 으로든 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.weii 그 전에 다른 스레드에서 참조하거나 클래스 초기화에서 참조하는 등의 방법으로 null 값으로 채워진 클래스 인스턴스를 볼 수 있습니다.
static 변수는 다음 세 가지 방법으로 초기화할 수 있습니다. 따라서 원하는 변수를 선택하십시오.
- 선언할 때 초기화할 수 있습니다.
또는 다음과 같은 정적 블록을 만들어 수행할 수 있습니다.
static { // whatever code is needed for initialization goes here }스태틱 블록 대신 프라이빗 스태틱메서드를 쓸 수 있습니다.
class name { public static varType myVar = initializeVar(); private static varType initializeVar() { // initialization code goes here } }
언급URL : https://stackoverflow.com/questions/8704423/when-are-static-variables-initialized
'programing' 카테고리의 다른 글
| java.sql.SQLException: - ORA-01000: 열려 있는 최대 커서 수를 초과했습니다. (0) | 2022.11.26 |
|---|---|
| Java의 ArrayList에서 원하는 값 가져오기 (0) | 2022.11.26 |
| 루트 액세스 없이 python 모듈을 설치하는 방법 (0) | 2022.11.26 |
| Python 스크립트를 실행하지 않고 어떻게 구문을 확인할 수 있습니까? (0) | 2022.11.26 |
| JavaScript에서 네임스페이스를 선언하려면 어떻게 해야 합니까? (0) | 2022.11.26 |