찾다

 >  Q&A  >  본문

java类加载机制-类定义中new如何理解

高洛峰高洛峰2803일 전892

모든 응답(5)나는 대답할 것이다

  • 黄舟

    黄舟2017-04-18 10:48:41

    Java 프로그램을 실행할 때 각 클래스는 한 번만 로드됩니다. 다시 로드하는 것은 불가능합니다. 따라서 질문에서 언급했듯이 재귀가 없습니다.

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-18 10:48:41

    JVM 가상 머신의 메모리를 먼저 이해하는 것이 좋습니다

    AVA 개체의 인스턴스화 프로세스 중에 사용되는 주요 구성 요소에는 가상 머신 스택, JAVA 힙 및 메서드 영역이 포함됩니다.
    JAVA 파일이 컴파일되면 먼저 JVM 메소드 영역에 추가됩니다. JVM 메소드 영역에서 매우 중요한 부분은 버전, 필드, 메소드, 인터페이스 및 기타 설명을 저장하는 데 사용되는 런타임 상수 풀입니다. 클래스 파일의 정보, 컴파일 타임 상수 및 정적 변수.
    JAVA 객체가 실제로 인스턴스화되는 위치는 JAVA 힙 및 가상 머신 스택입니다. 실제 메모리에서는 Object A = New Object()입니다. A는 실제로 Object 클래스 구현에 부여하는 이름과 동일합니다. 객체 지향 프로그래밍에서는 개가 동물의 범주에 속하지만 특정 개를 구별하기 위해 이름을 부여하는 것과 같습니다. Object는 A가 이 클래스에 속하고 A는 Object의 특정 구현을 참조하며 New Object는 이 클래스의 특정 구현을 생성하는 것과 동일하다는 것을 표시하는 데 사용됩니다. 따라서 우리는 객체가 먼저 자신이 속한 클래스를 지정할 수 있어야 하고, 두 번째로 자신이 참조하는 특정 구현을 지정할 수 있어야 한다는 것을 이해할 수 있습니다.
    해당 구현 방법에는 두 가지가 있습니다.

    1. 핸들 접근 객체

    2. 직접 포인터 접근 객체
    직접 포인터 접근 객체
    HotSpot은 두 번째 구현 방법을 사용합니다.
    클래스 로딩에는 로딩, 링크, 초기화의 3단계가 포함됩니다.
    로딩
    위 그림과 같이 객체가 인스턴스화되면 JVM이 다음을 수행한다는 것을 이해하는 것은 어렵지 않습니다. 필요한 객체 유형에 따라 JAVA 힙의 메모리 영역을 나누고 객체를 식별하기 위해 메소드 영역 객체 데이터 유형에 대한 포인터를 생성합니다.
    링크
    가상 머신 스택의 로컬 변수 테이블(로컬 변수 테이블이라고도 함)의 포인터는 JAVA 힙의 분할된 메모리 영역을 가리킵니다. JAVA 가상 머신은 동적 링크를 사용합니다. 컴파일된 클래스 파일만 메모리에 최종 메소드의 표현을 저장하지 않습니다.
    초기화
    초기화는 실제로 클래스 파일의 초기화 메서드에 대한 호출이며, 그 핵심은 가상 머신 스택에 있는 스택 프레임의 POP/PUSH입니다. 이는 클래스의 개체에 대해 동일한 로드 프로세스를 수행하는 것과 동일합니다.
    이제 객체의 완전한 인스턴스화 프로세스가 소개되었습니다.

    클래스의 내부 초기화 순서는 정적 도메인->비정적 도메인->생성자입니다

    추천도서:

    [JAVA Notes-Tao] 객체 생명주기 상세 설명
    [JAVA Notes-Tao] 클래스 초기화 이해

    회신하다
    0
  • PHPz

    PHPz2017-04-18 10:48:41

    클래스 로딩과 객체 초기화를 헷갈리시나요?

    회신하다
    0
  • 怪我咯

    怪我咯2017-04-18 10:48:41

    포스터가 너무 심오한 생각인가요? 인스턴스화와 선언 정의는 두 가지 개념과 단계입니다.
    A2에는 선언 시 인스턴스화되는 여러 정적 멤버 변수가 있으며 클래스의 인스턴스화 프로세스는 생성자를 통해 완료됩니다.
    여기에 둥지가 있는 것처럼 보이지만 그렇지 않습니다. 컴파일러는 인스턴스화 문을 컴파일할 때 명령어 점프를 선언할 수 있으며 점프 주소는 보조 컴파일 중에 결정됩니다.
    이런 방식으로 클래스 선언 단계에서 a, b, c, d가 인스턴스화되면 컴파일러는 A2(int i)의 생성자 블록으로 점프합니다.
    클래스 인스턴스화 단계 중에 A() 생성자로 점프합니다.
    직접 말하면, 작성자가 생각한 것처럼 서로 다른 단계에서 해당 구축 방법을 호출할 뿐입니다.

    회신하다
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:48:41

    클래스를 로드할 때 정적 변수와 생성자의 로드 순서가 다릅니다. 생성자 메서드는 본질적으로 정적 메서드이기도 합니다.
    잘 모르는 부분이 있어서 먼저 자리에 앉겠습니다

    회신하다
    0
  • 취소회신하다