> Java > java지도 시간 > 본문

Java에서 클래스와 객체를 초기화하는 방법

王林
풀어 주다: 2023-04-18 11:55:02
앞으로
1567명이 탐색했습니다.

먼저 아래 코드를 살펴보겠습니다. 이는 매우 고전적인 검사 방법입니다.

public class InitField {      public static void main(String[] args) {          SuperInitField p = new SuperInitField();          SuperInitField c = new SubInitField();      }  }   class SuperInitField {      public SuperInitField() {          System.out.println("parent");      }      static {          System.out.println("static parent");      }   }   class SubInitField extends SuperInitField {      public SubInitField() {          System.out.println("child");      }      static {          System.out.println("static child");      }  }
로그인 후 복사

정답을 빨리 작성할 수 있든 없든 우선 이 프로그램은 제쳐두고 Java 가상 머신 초기화의 원리를 이해해 봅시다.

JVM은 Java 프로그램을 실행하여 해당 유형을 사용할 수 있도록 Java 유형을 설치하고 연결하고 초기화합니다. 해당 타입의 라이프 사이클은 아래 그림과 같습니다.

Java에서 클래스와 객체를 초기화하는 방법

초기화 이전에 로딩 및 연결이 완료되어야 합니다.

클래스 초기화 단계는 주로 클래스 변수에 올바른 초기값을 할당하는 것입니다. 여기서 "올바른" 초기 값은 프로그래머가 이 클래스 변수에 기대하는 시작 값을 나타냅니다. 클래스 변수 초기화 문이나 정적 초기화 문을 통해 올바른 초기값을 부여한다. 클래스 초기화에는 두 단계가 포함됩니다.

1) 클래스에 직접 슈퍼클래스가 있고 직접 슈퍼클래스가 초기화되지 않은 경우 직접 슈퍼클래스를 먼저 초기화합니다.

2) 클래스에 클래스 초기화 메소드가 있는 경우 이 메소드를 실행합니다.

그럼 클래스 초기화는 언제 되나요? JVM(Java Virtual Machine) 사양은 클래스의 초기화 타이밍을 엄격하게 정의합니다. 즉, 클래스가 적극적으로 사용될 때 초기화됩니다.

그럼 ***의 적극적인 사용 기준을 충족하는 상황은 무엇인가요? Java 가상 머신 사양에서는 다음과 같이 설명합니다.

1) 클래스의 새 인스턴스를 생성합니다.

2) 클래스의 정적 메서드를 호출합니다.

3) 클래스 또는 인터페이스의 정적 필드를 조작합니다. 최종 필드) ;

4) Java의 특정 리플렉션 메소드를 호출합니다.

5) 클래스의 하위 클래스를 초기화합니다.

6) Java 가상 머신이 시작될 때 클래스를 초기화 클래스로 지정합니다.

위의 6가지 상황을 제외하고 다른 모든 메서드는 수동적으로 사용되며 클래스 초기화를 발생시키지 않습니다.

클래스가 로드, 연결 및 초기화되면 사용할 준비가 된 것입니다. 이제 객체 인스턴스화에 초점을 맞춰 보겠습니다. 객체 인스턴스화 및 초기화는 객체 수명의 초기 단계에 있는 활동입니다.

Java 컴파일러는 컴파일하는 각 클래스에 대해 하나 이상의 인스턴스 초기화 메서드, 즉 () 메서드를 생성합니다. 소스 코드의 각 클래스 생성자에는 해당 () 메서드가 있습니다. 클래스가 생성자를 명시적으로 선언하지 않으면 컴파일러는 클래스에 대해 인수가 없는 기본 생성자를 생성합니다. 이 기본 생성자는 부모 클래스의 인수가 없는 생성자만 호출합니다.

() 메소드에 포함된 코드 내용에는 다른 () 메소드 호출 및 메소드 본문 코드 구성;
생성자가 동일한 클래스에서 다른 생성자를 호출하여 명시적으로 시작하는 경우 해당 () 메서드 본문에 포함된 콘텐츠는 다음과 같습니다.

  1. 이 클래스의 () 메서드 호출;

  2. 생성 메소드에 해당하는 메소드 본문의 바이트코드를 구현합니다.
  3. 생성자가 자체 클래스의 다른 생성자를 호출하여 시작하지 않고 객체가 Object 객체가 아닌 경우 () 메서드의 내용은 다음과 같습니다.

    부모 클래스< init>() 메소드 호출
  1. 모든 인스턴스 변수 초기화 메소드의 바이트코드
  2. 는 생성 메소드에 해당하는 메소드 본문의 바이트코드를 구현합니다.
  3. 위 설명이 Java 유형의 초기화를 이해하는 데 도움이 되었나요?

좋아요, 코드의 시작 부분을 다시 분석해 보겠습니다.

SuperInitField p = new SuperInitField();  //SuperInitField的超类是Object  //创建SuperInitField对象,属于***主动使用,因此要先初始化Object类,然后再调用SuperInitField类变量初始化语句或者静态初始化语句,所以要输出static parent  //类被装载、连接和初始化之后,创建一个对象,因此需要首先调用了Object的默认构造方法,然后再调用自己的构造方法,所以要输出parent    SuperInitField c = new SubInitField();  //SubInitField继承自SuperInitField  //创建SubInitField对象,属于***主动使用,父类SuperInitField已被初始化,因此只要调用SubInitField类变量初始化语句或者静态初始化语句,所以要输出static child  //类被装载、连接和初始化之后,创建一个对象,因此需要首先调用了SuperInitField的构造方法,然后再调用自己的构造方法,所以要输出parent,然后再输出child
로그인 후 복사

이제 Java 클래스 초기화 원리에 대한 일반적인 이해가 되었으니 연습에 맡기고 다음 코드의 결과를 작성하겠습니다.

아아아아

위 내용은 Java에서 클래스와 객체를 초기화하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿