Java 키워드this(동력 노드 Java 학원 정리)

3571 단어 java키워드this
우리는 보통 자바에 있는this 키워드를 사용할 때,this가 이 종류를 호출하고 있는 방법을 대표하는 현재의 실례라는 것을 안다.통상적인 상황에서this키워드를 이해하는 것은 매우 쉽지만 제가 처음 배웠을 때 의문이 하나 있었지만 뚜렷하게 이해하지 못했습니다. 이제 천천히 이해하면 그것을 적어 놓으려고 합니다. 아마도 누군가가 저와 같은 의문을 가지고 다른 사람에게 도움이 될지 모르겠습니다.우리 우선 일반적인 상황에서this의 작용을 간단하게 봅시다.예를 들어 다음 코드:

public class Leaf {
 private int i = 0;
 Leaf increment() {
  i++;
  return this;
 }
 void print() {
  System.out.println("i = " + i);
 }
 public static void main(String[] args) {
  Leaf x = new Leaf();
  x.increment().increment().print();
 }
}
Leaf 클래스의main 방법에서, 우리는new에서 Leaf 실례 x를 하나 만들었고, 그 다음에 x 실례 호출 increment() 방법을 사용했다.만약 increment () 가 일반적인 방법이나void 방법이라면 이곳은 우리가 연구할 만한 것이 없다.특수한 것은 increment() 방법에서 우리return은this이다. 이this는 우리가 방금 만든 x를 대표한다.x가 increment () 방법을 호출하고 있기 때문에 increment() 방법this는 분명히 Leaf의 x 실례를 대표한다.
이것은 토론할 만한 것이 없어 보인다.this는 이 방법을 호출하는 실례 x를 대표한다.그러나, 만약에 우리가main () 함수를 아래의 모양으로 수정한다면

public static void main(String[] args) {
 Leaf x = new Leaf();
 x.increment().increment().print();
  
 Leaf y = new Leaf();
 y.increment().increment().print();
}
위에서 수정한 코드에서, 우리는 Leaf 실례 y를 추가했고, y도 increment () 를 두 번 호출했습니다.지금 문제가 생겼습니다. 만약에 x, y가 동시에 호출되는 increment () 방법이라면,this는 도대체 누구를 대표할 수 있습니까?이게 무슨 문제라고 생각할지도 몰라요. x는 increment () 방법을 사용하고,this는 x를 대표하고, y는 increment () 방법을 사용하고,this는 y를 대표합니다.문제는 우리가 호출 방법을 말할 때 jvm 차원에서 Leaf 클래스 increment() 방법이 있는 메모리 주소를 찾아서 자바 가상 머신 창고에 창고 프레임을 만드는 것이다.
그리고 창고 프레임에서 실행 방법에 있는 코드입니다.지금 보셨죠? 즉, jvm 실행 방법 차원에서 이른바 x호출, y호출이 없습니다. 그러면 방법 중의this는 도대체 어떤 실례를 가리키는지 어떻게 확정합니까?
우리는 Leaf류 바이트 코드에서 어떻게 보여주었는지, 우리가 뭘 빠뜨렸는지 살펴보자. 만약에 우리가 x실례나 y실례를 방법에 전달하지 않았다면 jvm에서 방법을 실행할 때this가 구체적으로 어떤 실례를 가리키는지 알 수 없을 것이다.
여기서 우리는 increment() 방법에서 인코딩에 매개 변수가 없지만 바이트 코드에 매개 변수의 개수가 1이라는 것을 보았다. 생각해 보면 결과는 이미 뚜렷하다. jvm가 인코딩을 실행할 때 실례 방법에서 기본적으로 숨겨진 매개 변수를 전달한다. 이 매개 변수는 현재 호출된 실례 자체이다.예를 들어 x 호출, 숨기면 x 전송, y 호출, y 전송.그래서 우리의this는 jvm 집행 방법 차원에서 도대체 누구를 가리키는지 확정할 수 있다.
위의 결론은 우리가 스스로 추단한 것이다. 그 책이 이것에 대해 상세한 묘사가 있습니까?《자바 프로그래밍 사상》.에서 이 덩어리에 대해 이렇게 묘사했다.
우리가 하나의 방법의 내부에 있다고 가정하고 현재 대상의 문단을 얻기를 바란다.그 핸들은 컴파일러'비밀'에 의해 전달되기 때문에 식별자가 사용할 수 없습니다.그러나 이 목적에 대한 전용 키워드는this입니다.
안에서 말한 이 컴파일러가 비밀리에 전달하는 손잡이가 바로 우리가 있는 이 숨겨진 매개 변수이다.
여기까지this에 대한 묘사는 분명히 알고 있을 것입니다. 우리는 jvm 차원에서 그것을 이해했습니다.그러면 여러분은 아래의 이 예를 보시고 이 기류 B 중의this가 무엇을 대표하는지 생각해 보시겠습니까?

public class B {
 public B() {
  System.out.println(this.getClass().getSimpleName()); 
  System.out.println(((A) this).a); 
 }
}
public class A extends B {
 public int a = 100;  
 public A() {
  a = 200;
 } 
 public static void main(String[] args) {
  new A();
 }
}
이 예는 원래 자바가 계승 구조를 가지고 있을 때 클래스가 어떻게 초기화를 완성하는지 이해하기 위해서였지만 이 안의 B 클래스의 구조 함수는 비교적 특수하다. B 클래스의 구조 함수 중this가 출력하는 SimpleName은 A이다.보통 우리가 만나는 상황, B 클래스의this 출력의 SimpleName은 B여야 하는데, 여기는 A?왜?
위에서 우리가this를 이야기하는 과정에서 사실은 이미 이 부분과 관련이 있다. 자바 방법을 호출하여 창고 프레임을 만들 때 jvm는 비밀리에 현재의 실례를 전달할 것이다.그래서 우리가 A의 구조 함수를 실행할 때 기본적으로 부류 B의 구조 함수를 호출한다. 부류 B의 구조 함수를 호출할 때 비밀리에 전해지는 현재 실례는 A의 실례이다. - A의 구조 함수에서 호출된 B이기 때문에 이곳의this는 오히려 A를 대표한다.
위에서 말한 것은 편집자가 여러분께 소개한 자바 키워드this(동력 노드 자바 학원 정리)입니다. 여러분께 도움이 되었으면 합니다. 만약에 궁금한 것이 있으면 저에게 메시지를 남겨 주십시오. 편집자는 제때에 여러분에게 회답할 것입니다.여기에서도 저희 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기