Java 클래스의 각 성분 로드 순서와 메모리의 저장 위치

1. 클래스는 언제 불러옵니까?
클래스의 내용을 사용할 때 불러옵니다. 세 가지 상황이 있습니다.
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()  
자바 클래스의 각 성분 로드 순서와 메모리에 저장된 위치는 바로 편집자가 여러분에게 공유한 모든 내용입니다. 참고 부탁드리고 저희를 많이 사랑해 주세요.

좋은 웹페이지 즐겨찾기