자바 에서 왜 this 가 현재 인 스 턴 스 를 호출 할 수 있 습 니까?

3522 단어 Javathis호출
1.머리말
자바 를 처음 배 웠 을 때 모두 this 키 워드 를 접 했 을 것 입 니 다.특히 구조 함수 가 값 을 부여 할 때 다음 과 같은 예제 가 있 습 니 다.

public class Person {
 private String name;
 private int age;

 public Person(String name, int age) {
  //    this   ,             
  this.name = name;
  this.age = age;
 }
}

구조 함수 에서 구성원 변수 이름과 매개 변수 이름 이 같 으 면 this 키 워드 를 추가 해 야 합 니 다.그렇지 않 으 면 매개 변수 name 을 그 자체 에 할당 할 뿐 Person.name 에 할당 하지 않 았 습 니 다.부분 변수의 우선 순위 가 구성원 변수 보다 높 기 때 문 입 니 다.this 키 워드 를 추가 하면 this 가 현재 인 스 턴 스 를 가리 키 기 때문에 대상 의 구성원 변 수 를 할당 할 수 있 습 니 다.
그런데 왜 this 키 워드 를 통 해 현재 대상 에 접근 할 수 있 습 니까?
2.스 택 프레임
이 문 제 를 파악 하려 면 먼저 JVM 이 방법 을 실행 할 때 방법 스 택 의 스 택 프레임 구 조 를 알 아야 한다.
자바 가상 머 신 은[방법]을 가장 기본 적 인 운영 단위 로 하고[스 택 프레임]은 JVM 을 지원 하 는 방법 으로 뒤의 데이터 구 조 를 호출 하 는 것 입 니 다.이것 은 JVM 이 실 행 될 때 데이터 구역 의[가상 머 신 스 택]중의 스 택 요소 이기 도 합 니 다.
쉽게 말 하면 방법의 집행 과정 은 하나의 스 택 프레임 이 스 택 에 들 어가 서 스 택 에서 나 오 는 과정 으로 볼 수 있다.
스 택 프레임 에 방법 이 저 장 된 것:부분 변수 표,조작 수 스 택,동적 연결 과 방법 으로 주소 등 정 보 를 되 돌려 줍 니 다.

javac 프로그램 을 사용 하여 원본 코드 를 바이트 코드 로 컴 파일 한 후,한 방법의 스 택 프레임 은 얼마나 큰 부분 변수 표 가 필요 합 니까?얼마나 깊 은 작업 스 택 은 이미 계산 되 었 고,방법 표 의[Code]속성 에 기록 되 었 습 니 다.이 모든 것 은 프로그램 이 실 행 될 때 와 무관 합 니 다.
다시 말 하면 하나의 방법 은 몇 개의 부분 변 수 를 가지 고 있 는 지,컴 파일 할 때 이미 확정 되 었 으 며,프로그램의 운행 에 따라 바 뀌 지 않 는 다 는 것 이다.오늘 우리 가 탐구 하고 자 하 는[this]문 제 는 바로 방법 창고 의 부분 변수 표 에 있다.
3.분석
우 리 는 여전히 자바 p 명령 으로 컴 파일 된 Class 파일 을 분석 하 는데 이것 이 가장 설득력 이 있다.

public class Person {

 public void say() {

 }

 public static void staticSay() {
  
 }
}

이전 코드 와 같이 각각 인 스 턴 스 방법 과 정적 방법 이 있 습 니 다.우 리 는 정적 방법 에서[this]에 접근 할 수 없다 는 것 을 알 고 있 지만 인 스 턴 스 방법 에서 가능 합 니 다.
먼저 javac Person.java,그리고 javap-verbose Person,얻 은 정보 가 좀 길 어 요.저 는 이 두 가지 방법의 정보 만 붙 일 게 요.

public void say();
descriptor: ()V
flags: ACC_PUBLIC
Code:
  stack=0, locals=1, args_size=1
  0: return
  LineNumberTable:
 line 8: 0

public static void staticSay();
descriptor: ()V
flags: ACC_PUBLIC, ACC_STATIC
Code:
  stack=0, locals=0, args_size=0
  0: return
  LineNumberTable:
 line 12: 0

[Code]란 에 중점 을 두 고 say()는 부분 변수 가 있 고 매개 변수 가 있 습 니 다.staticSay()는 부분 변수 도 없고 인자 도 없습니다.
의 심 스 럽 죠?say()방법 형 삼 은 비어 있 고 방법 체 도 비어 있 습 니 다.왜 컴 파일 한 후에 부분 변수 와 형 삼 이 있 는 지 보 여 줍 니까?
사실은 인 스 턴 스 방법 에 있어 서 적어도 하나의 매개 변수 와 부분 변 수 는 현재 대상 이다.JVM 은 대상 의 인 스 턴 스 방법 을 호출 할 때 대상 자체 의 인용 을 0 번 매개 변수 로 전달 합 니 다.그러면 this 키 워드 를 통 해 대상 자체 에 접근 할 수 있 습 니 다.사실은 0 번 째 매개 변수 에 접근 하 는 것 입 니 다.
아래 와 같이 이 두 가지 방법 은 사실 등가 이다.

public void say(Person this, String text) {
    System.out.println(text);
}

public void say(String text) {
    System.out.println(text);
}
4.총화
자바 가상 머 신 은 방법 을 실행 할 때 방법 을[스 택 프레임]으로 포장 합 니 다.스 택 프레임 에[부분 변수 표]가 있 고 매개 변수 도 부분 변수 표 의 일부분 입 니 다.한 방법의 부분 변수 표 가 얼마나 큰 지 는 컴 파일 할 때 이미 확정 되 었 으 며 프로그램의 운행 에 따라 달라 지지 않 습 니 다.
인 스 턴 스 방법 에 있어 서 컴 파일 할 때 숨겨 진 0 번 인 자 를 자동 으로 추가 합 니 다.바로 현재 클래스 입 니 다.JVM 은 대상 의 인 스 턴 스 방법 을 호출 할 때 대상 을 0 번 매개 변수 로 자동 으로 참조 하여 전달 합 니 다.[this]를 방문 하 는 것 은 0 번 매개 변수 입 니 다.
자바 에서 왜 this 가 현재 인 스 턴 스 를 호출 할 수 있 는 지 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 this 호출 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기