자바 에서 대상 을 만 들 때 구성원 변수의 코드 실행 순 서 를 초기 화 합 니 다.
class Template {
int i;//
double d;
String name= "a name";// ( )
//
{
d = 1.0;
}
Template(){
name = "another name";
}
}
대상 을 만 들 때 대상 의 모든 필드(속성 구성원,즉 클래스 변수)는 위의 Template 클래스 와 같은 기본 값 을 부여 합 니 다.필드 i 가 초기 값 을 주지 않 아 도 합 법 적 입 니 다.템 플 릿 대상 을 만 들 때 i 는 기본 초기 값 0 을 부여 합 니 다.앞에서 말 한 바 와 같이 모든 필드 에 기본 값 이 부여 되 기 때문에 name 필드 에 초기 값 이 부여 되 더 라 도 name 에 초기 값 이 부여 되 기 전에 기본 값 null 이 먼저 부여 되 었 습 니 다.
구조 대상 에서 필드 를 초기 화 할 수 있 는 세 가지 방법 이 있 습 니 다.문 구 를 초기 화 하 는 것(즉,성명 필드 는 할당),블록 을 초기 화 하 는 것,구조 함수 입 니 다.
초기 화 블록 의 위치 와 초기 화 문장의 위치 차이 가 많 지 않 습 니 다.초기 화 블록 의 등장 은 복잡 한 초기 화 어의 수 요 를 만족 시 키 기 위해 서 입 니 다(방법 처럼 초기 화 블록 에 복잡 한 문 구 를 쓸 수 있 습 니 다).
필드 초기 화 순 서 를 실행 하 는 것 은 모든 필드 에 초기 값 을 부여 한 다음 에 초기 화 문 구 를 호출 한 다음 에 초기 화 블록 을 호출 하고 마지막 으로 구조 함 수 를 호출 하 는 것 으로 간단하게 볼 수 있 습 니 다.
다음은 제 가 테스트 한 코드 입 니 다.
public class A{
String s = "A:statement";
{
System.out.println(s);
s = "A:block";
System.out.println(s);
}
A(){
s = "A:constructor";
System.out.println(s);
}
public static void main(String[] args){
new A();
}
}
위의 코드 를 실행 하려 고 시도 하면 초기 화 할 때 실 행 된 순 서 를 알 수 있 습 니 다.초기 화 문 구 는 초기 화 블록 보다 구조 함수(기본 값 이 나타 나 지 않 음)보다 먼저 실 행 됩 니 다.
그러나 대상 을 대상 으로 하 는 모델 은 계승 차원 이 있 기 때문에 계승 을 고려 하면 좀 복잡 해 야 한다.
필드 의 초기 화 는 두 단계 로 나 뉘 는데 첫 번 째 단 계 는 모든 필드(계 승 된 필드 포함)에 기본 값 을 부여 하고 두 번 째 단계 로 들 어 갑 니 다.두 번 째 단 계 는 세 단계 로 나 뉜 다.
1.부모 클래스 의 구조 기 를 호출 합 니 다.
2.이 필드 의 초기 화 구문 과 초기 화 블록 을 호출 합 니 다.
3.집행 구조 체
위의 이 말 은 책 에서 따 온 것 으로 이해 하기 어렵 고 개인 적 으로 표현 이 정확 하지 않다 고 생각 합 니 다.
다음은 내 이해 로 초기 화 된 2 단계 의 순 서 를 하나의 모델 로 설명 한다.
{
;
{
}
(){
super(..);// 1
* // (*) ,
*
// 3
}
2(){
this(..);
}
}
다음 코드 는 제 가 직접 작성 한 것 입 니 다.출력 결 과 를 실행 해 보 세 요.
class A{
String s = "A:statement";
{
System.out.println(s);
s = "A:block";
System.out.println(s);
}
A(){
s = "A:constructor";
System.out.println(s);
}
}
class B extends A{
String s = "B:statement";
{
System.out.println(s);
s = "B:block";
System.out.println(s);
}
B(){
s = "B:constructor";
System.out.println(s);
}
}
class C extends B{
String s = "C:statement";
{
System.out.println(s);
s = "C:block";
System.out.println(s);
}
C(){
s = "C:constructor";
System.out.println(s);
}
}
public class ConstructTest{
public static void main(String[] args){
new C();
}
}
위의 모델 표현의 초기 화 과정 은 재 귀적 호출 과 유사 하 며,결 과 는 최 하층 의 부 류 를 먼저 초기 화 한 다음 에 한 단계 위로 유추 하 는 것 이다.그래서 다음 과 같은 결론 을 내 릴 수 있다.
하나의 종 류 를 예화 할 때 계승 관계 가 낮은(부모 클래스 에서 하위 클래스 까지)순서 로 필드 를 초기 화 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.