Java 클래스의 각 성분 로드 순서와 메모리의 저장 위치
클래스의 내용을 사용할 때 불러옵니다. 세 가지 상황이 있습니다.
1. 객체 만들기: new StaticCode();
2. 사용 클래스의 정적 구성원: StaticCode.num=9; StaticCode.show();
3. 명령줄에서 실행:java StaticCodeDemo
2. 클래스 모든 내용 불러오는 순서와 메모리의 저장 위치
구문을 이용한 분석:
1.Person p=new Person("zhangsan",20);
이 한마디로 하는 일:
1. 창고 메모리에서main 함수의 공간을 열어main 함수의 변수 p를 만듭니다.
2. 클래스 파일 불러오기: new는 Person을 사용해야 하기 때문입니다.class, 그래서 먼저 하드디스크에서 Person을 찾아야 합니다.class 클래스 파일을 메모리에 불러옵니다.
클래스 파일을 불러올 때 비정적 구성원 변수 (객체의 고유 속성) 를 제외하고는 불러오지 않습니다.
기억해라: 불러오는 것은 클래스 파일의 한 줄의 내용을 메모리에 저장하고 어떤 문장도 실행하지 않습니다. --->불러오는 시기에는 출력 문장이 있어도 실행되지 않습니다.
정적 구성원 변수 (클래스 변수) ---> 메소드 영역의 정적 부분
정적 방법 ----> 메소드 영역의 정적 부분
정적 코드 블록 ----> 메소드 영역의 정적 부분
비정적 방법(구조 함수 포함)---> 방법 영역의 비정적 부분
구성 코드 블록 ----> 메소드 영역의 정적 부분
참고:
인격에서.class 파일을 불러올 때 정적 방법과 비정적 방법은 모두 방법 구역에 불러옵니다. 단지 비정적 방법으로 호출할 때 먼저 하나의 대상을 실례화해야 합니다.
대상이 비정적 방법을 호출할 수 있습니다.클래스의 모든 비정적 방법을 대상의 실례화에 따라 한 번 만들면 메모리 자원을 대량으로 소모하게 됩니다.
그래서 모든 대상이 이러한 비정적 방법을 공유하고this 키워드로 비정적 방법을 호출하는 대상을 가리킨다.
3. 실행 클래스의 정적 코드 블록: 있으면 Person.class 클래스를 초기화합니다.
4. 공간 개척: 메모리 더미에 공간을 열고 메모리 주소를 분배한다.
5. 기본 초기화: 더미 메모리에 대상의 특유의 속성을 만들고 기본 초기화를 합니다.
6. 표시 초기화: 속성을 표시 초기화합니다.
7. 구조 코드 블록: 실행 클래스의 구조 코드 블록, 대상에 대한 구조 코드 블록 초기화.
8. 구조 함수 초기화: 대상에 대응하는 구조 함수 초기화.
9. 메모리 주소를 창고 메모리의 변수 p에 값을 부여합니다.
2.p.setName("lisi");
1. 창고 메모리에 setName 방법을 열 수 있는 공간입니다. 대상의 인용this, 임시 변수name
2. p의 값을this에 부여하면this는 무더기에서 이 방법을 호출하는 대상을 가리킨다.
3. 임시 변수name에 "lisi"값을 부여합니다.
4. 임시 변수의 값을this의name에 부여합니다.
3.Person.showCountry();
1. 창고 메모리에서 showCountry () 방법의 공간을 엽니다. 클래스 이름의 인용Person이 있습니다.
2. Person은 메소드 영역에서 Person 클래스의 정적 메소드 영역의 주소를 가리킵니다.
3. 정적 방법 영역의country를 호출하고 출력합니다.
주의: 클래스의 구성원을 사용하려면 호출해야 합니다.무엇으로 호출합니까?유: 클래스,this,super
3. 정적 코드 블록, 구조 코드 블록과 구조 함수의 차이
정적 코드 블록: 클래스를 초기화하는 데 사용되며, 클래스를 불러올 때 실행되며, 한 번만 불러옵니다.
구성 코드 블록: 대상을 초기화하는 데 사용됩니다.대상을 만들면 이 부분은 실행되고 구조 함수에 우선합니다.
구조 함수: 대응하는 대상을 초기화하고 대상을 세울 때 해당하는 구조 함수를 선택하여 대상을 초기화합니다.
대상을 만들 때, 세 가지가 불러오는 실행 순서: 정적 코드 블록 ---> 구조 코드 블록 ---> 구조 함수
class Person
{
private String name;
private int age=0;
private static String country="cn";
Person(String name,int age)
{
this.name=name;
this.age=age;
}
static
{
System.out.println(" ");
}
{ System.out.println(name+"..."+age); }
public void setName(String name)
{
this.name=name;
}
public void speak()
{
System.out.println(this.name+"..."+this.age);
}
public static void showCountry()
{
System.out.println("country="+country);
}
}
class StaticDemo
{
static
{
System.out.println("StaticDemo 1");
}
public static void main(String[] args)
{
Person p=new Person("zhangsan",100);
p.setName("lisi");
p.speak();
Person.showCountry();
}
static
{
System.out.println("StaticDemo 2");
}
}
출력 결과:StaticDemo 정적 코드 블록 1
StaticDemo 정적 코드 블록 2
정적 코드 블록 실행
null...0//구성 코드 블록
lisi...100 //speak()
country=cn //showCountry()
자바 클래스의 각 성분 로드 순서와 메모리에 저장된 위치는 바로 편집자가 여러분에게 공유한 모든 내용입니다. 참고 부탁드리고 저희를 많이 사랑해 주세요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.