자바 프로그래머 의 일상 - 자바 클래스 로 딩 순서
계승 로 딩 순서
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
그래서 결론 을 내 릴 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.