자바 프로그래머 의 일상 - 자바 클래스 로 딩 순서

3794 단어
앞서 자바 클래스 의 로 딩 순 서 를 말 했 듯 이 이번 에는 계승 부분 을 보고 계승 과 결합 하여 클래스 의 로 딩 순 서 를 말 합 니 다.
계승 로 딩 순서
static 블록 은 클래스 를 처음 불 러 올 때 실행 되 기 때문에 다음 예 는 static 블록 으로 클래스 의 로드 순 서 를 테스트 하 는 것 입 니 다.
package xing.test.thinking.chap7;
class A{
    static{
        System.out.println("A static");
    }
}
class B extends A{
    static{
        System.out.println("B static");
    }
}
class C extends B{
    private static D d = new D();
    static{
        System.out.println("C static");
    }
}
class D{
    static{
        System.out.println("D static");
    }
}
public class ExtendTest {
    public static void main(String[] args) {
        C c = new C();
    }
}

위의 예 에서 클래스 C 는 B, B 는 A 를 계승 하고 C 는 D 에 의존한다.따라서 C 를 만 들 때 C 가 계승 하 는 B 와 의존 하 는 D 를 자동 으로 불 러 오고 B 는 계승 하 는 A 를 불 러 옵 니 다.A 로드 가 완료 되 어야 B 를 순조롭게 로드 할 수 있 습 니 다.BD 를 불 러 와 야 C 를 불 러 올 수 있 습 니 다.이것 이 바로 클래스 의 로드 순서 입 니 다.
A static
B static
D static
C static

모든 변수 가 초기 화 되 어야 구조 방법 이 실 행 됩 니 다.
클래스 를 불 러 오 는 과정 에서 내부 변수 가 만들어 져 야만 이러한 구조 방법 을 실행 할 수 있 습 니 다.
package xing.test.thinking.chap7;
class A2{
    B2 b2 = new B2();
    static{
        System.out.println("A static");
    }
    public A2() {
        System.out.println("A2()");
    }
}
class B2{
    C2 c2 = new C2();
    D2 d2 = new D2();
    static{
        System.out.println("B static");
    }
    public B2() {
        System.out.println("B2()");
    }
}
class C2{
    static{
        System.out.println("C static");
    }
    public C2() {
        System.out.println("C2()");
    }
}
class D2{
    static{
        System.out.println("D static");
    }
    public D2() {
        System.out.println("D2()");
    }
}
public class VarTest {
    public static void main(String[] args) {
        A2 a2 = new A2();
    }
}

위의 예 에서 A2 에는 B2 변수 가 있 고 B2 에는 C2D 2 변수 가 있다.따라서 클래스 의 불 러 오 는 것 이 먼저 읽 히 는 것 인지 정적 블록 을 실행 합 니 다.의존 하 는 대상 이 모두 정의 되 어야 구조 방법 을 실행 할 수 있 습 니 다.
A static
B static
C static
C2()
D static
D2()
B2()
A2()

정적 구성원 과 일반 구성원 클래스 의 로드 차이
클래스 를 불 러 오 는 과정 에서 정적 구성원 클래스 의 대상 은 우선 불 러 옵 니 다.일반 멤버 류 의 대상 은 사용 할 때 만 불 러 옵 니 다.
package xing.test.thinking.chap7;
class A3{
    B3 b3 = new B3();
    static C3 c4 = new C3();
    static{
        System.out.println("A3");
    }
}
class B3{
    static{
        System.out.println("B3");
    }
}
class C3{
    static{
        System.out.println("C3");
    }
}
public class StaticTest {
    public static void main(String[] args) {
        A3 a3 = new A3();
    }
}

출력:
C3
A3
B3

총결산
첫 번 째, 모든 클래스 는 기본 클래스 의 두 번 째 점 을 우선 불 러 옵 니 다. 정적 구성원 의 초기 화 는 세 번 째 점 을 우선 합 니 다. 구성원 이 초기 화 된 후에 야 구조 방법 네 번 째 점 을 실행 할 수 있 습 니 다. 정적 구성원 의 초기 화 와 정적 블록 의 실행 은 클래스 로 딩 할 때 발생 합 니 다.네 번 째, 클래스 대상 의 생 성 및 정적 블록 에 대한 접근 은 클래스 의 로드 를 촉발 합 니 다.
보충 류 구조 방법의 순서
코드 보기:
package xing.test.thinking.chap8;
class A{
    public A() {
        System.out.println("A");
    }
}
class B extends A{
    public B() {
        System.out.println("B");
    }
}
class C extends B {
    private D d1 = new D("d1");
    private D d2 = new D("d2");
    public C() {
        System.out.println("C");
    }
}
class D {
    public D(String str) {
        System.out.println("D "+str);
    }
}
public class ExtendTest {
    public static void main(String[] args) {
        C c = new C();
    }
}

실행 결과:
A
B
D d1
D d2
C

그래서 결론 을 내 릴 수 있다.
  • 먼저 기류 의 구조 방법
  • 을 호출한다.
  • 그 다음으로 구성원 을 호출 하 는 구조 방법
  • 마지막 으로 자신의 구조 방법
  • 을 사용한다.

    좋은 웹페이지 즐겨찾기