>  기사  >  Java  >  Java 상속에서 상위 클래스 객체 생성 문제에 대한 자세한 설명

Java 상속에서 상위 클래스 객체 생성 문제에 대한 자세한 설명

PHP中文网
PHP中文网원래의
2017-06-20 10:18:431777검색

부모 클래스 생성자를 호출하는 것은 사실이지만 부모 클래스 객체가 전혀 생성되지 않고 단지 부모 클래스 생성자를 호출하여 속성을 초기화하는 것뿐입니다.

부모 클래스 생성자를 호출하는 것이 부모 클래스 객체를 만드는 것과 같다고 하면 정말 말도 안 되는 소리입니다.
새 명령어는 객체 등의 다양한 속성 참조를 저장하는 데 사용되는 공간을 엽니다. 바이트코드를 디컴파일하면 새 명령어가 하나만 있으므로 공간이 열리고 객체 하나가 그 안에 배치됩니다. 각 공간.
그러면 하위 클래스가 상위 클래스의 속성, 메서드 등을 호출하면 인스턴스화된 객체가 아닙니다.
바이트코드에서 하위 클래스는 CONSTANT_Class_info 유형에 속하는 u2 유형의 상위 클래스 인덱스를 갖게 되며, CONSTANT_Class_info 설명을 통해 CONSTANT_Utf8_info를 찾은 다음 지정된 상위 클래스를 찾을 수 있습니다.
귀하의 방법에서는 속성 이름이 이에 대해 구문 분석된 다음 실제 변수 내용이 new가 생성한 공간에 저장됩니다. . .
super 키워드는 이 공간의 특정 부분(즉, 상위 클래스 데이터를 저장하는 전용 메모리 부분)의 데이터에만 액세스합니다. . . . . .

기본 해시코드와 같음(직접 사용 == 비교)은 동일하므로 기본적으로 같은 공간에 있고, 별도의 상위 클래스 객체가 없습니다.


하위 클래스를 부모 클래스로 강제 변환하여 사용할 수 있는 이유는 자바 가상 머신이 정적 유형(외형 유형)과 실제 유형의 개념을 갖고 있기 때문입니다.
예를 들어 Object t=new Point(2,3);
그러면 Object는 정적 유형(외형 유형)에 속하고 Point는 실제 유형에 속합니다.
정적 유형과 실제 유형 모두 프로그램에서 변경될 수 있습니다. 차이점은 정적 유형의 변경은 이를 사용할 때만 발생하는 반면 변수 자체의 정적 유형은 변경되지 않으며 최종 정적 유형은 컴파일 중에 알려집니다. 실제 변수 유형의 변경 결과는 런타임 중에만 결정될 수 있습니다. 컴파일러는 컴파일할 때 변수의 실제 유형이 무엇인지 알 수 없습니다. 속합니다. 클래스가 가상 머신에 로드될 때 이 클래스에 의해 생성된 개체의 레이아웃이 이미 결정되었다고 말할 수도 있습니다.

핫스팟의 Java 개체 메모리 레이아웃:
각 Java 개체는 메모리의 개체 헤더와 개체 본문으로 구성됩니다.
객체 헤더는 객체가 속한 클래스 객체 클래스에 대한 참조와 해시코드 및 모니터에 대한 일부 정보를 포함하여 객체의 메타 정보를 저장합니다.

객체 본문에는 주로 Java 객체 자체의 인스턴스 필드와 상위 클래스에서 상속된 인스턴스 필드가 저장되며 내부 레이아웃은 다음 규칙을 충족합니다.

규칙 1: 모든 객체는 8바이트 단위로 정렬됩니다.

규칙 2: 인스턴스 필드는 long 및 double 유형, 정수 및 부동 소수점 유형, 문자 및 짧은 정수 유형, 마지막으로 참조 유형에 따라 정렬됩니다. 이러한 인스턴스 필드는 해당 단위에 따라 정렬됩니다.
규칙 3: 서로 다른 클래스 상속 관계의 인스턴스 필드는 혼합될 수 없습니다. 먼저 상위 클래스의 인스턴스 필드가 규칙 2에 따라 처리되고 그 다음에는 하위 클래스의 인스턴스 필드가 처리됩니다.

규칙 4: 상위 클래스의 마지막 멤버와 하위 클래스의 첫 번째 멤버 사이의 거리가 4바이트 미만인 경우 기본 단위인 4바이트로 확장해야 합니다.
규칙 5: 하위 클래스의 첫 번째 인스턴스 필드가 double 또는 long 정수이고 상위 클래스가 8바이트를 사용하지 않은 경우 JVM은 int(int), short(short) )에 따라 규칙 2를 위반합니다. 바이트 유형(byte), 참조 유형(reference)의 순서로 채워지지 않은 공간을 채웁니다.

위는 Java 객체의 메모리 레이아웃에 대한 규칙입니다.

다음으로 일반적인 메소드인 Java 객체의 인스턴스화 메소드에 대해 이야기하겠습니다.
새 객체를 생성하면 실제로 jvm은 객체의 전체 공간을 할당하고 전체 객체의 인스턴스 도메인 레이아웃이 결정됩니다.
인스턴스화 방법 은 객체 인스턴스 필드의 값을 해당 공간으로 설정하는 것입니다.

메소드는 상위 클래스의 메소드를 호출하여 시작하고 자체 생성자 메소드로 끝납니다. 인스턴스 필드 선언과 인스턴스 초기화 명령문 블록 사이의 위치 관계는 컴파일러가 생성한 메소드의 바이트코드 순서에 영향을 미칩니다.


예를 들어 설명하겠습니다.
class Parent {

private short six;

private int age;

}


class Sub extend Parent{
private String name;
private int age;
private float Price;

}

하위 개체의 현재 메모리 레이아웃은 다음과 같습니다.

소위 상위 클래스 저장 공간 표현이라는 슈퍼의 의미는 무엇입니까?
여기 슈퍼스토리지는 그린이 아닐까 싶어요!


위 내용은 Java 상속에서 상위 클래스 객체 생성 문제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.