2012-01-19 2 views
6

this 포인터가 개체 자체를 가리키는 점은 무엇입니까? 그것은 자바 구현 또는 컴파일러 구현 무엇입니까?자바 "this"키워드는 어떻게 구현됩니까?

+0

우리가 '이'에 대해 최대한 활용하는 것입니다. http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#251519 – kosa

답변

1

당신은 왜

퍼센트 JAVA_HOME %의/빈/javac의의 HelloWorld.java

를 사용하여 컴파일러

class HelloWorld 
{ 
    private String hello = "Hello world!"; 

    private void printHello(){ 
    System.out.println (this.hello); 
} 

public static void main (String args[]){ 
    HelloWorld hello = new HelloWorld(); 
    hello.printHello(); 
} 

}

컴파일에 의해 생성 된 바이트 코드를 보지 관심이 잘 경우

바이트 코드 사용

javap -c HelloWorl D

편집 추가 출력

enter code here 

HelloWorld(); 
Code: 
0: aload_0 
1: invokespecial #1; //Method java/lang/Object."<init>":() 
4: aload_0 
5: ldc  #2; //String Hello world! 
7: putfield  #3; //Field hello:Ljava/lang/String; 
10: return 

public static void main(java.lang.String[]); 
Code: 
0: new  #6; //class HelloWorld 
3: dup 
4: invokespecial #7; //Method "<init>":()V 
7: astore_1 
8: aload_1 
9: invokespecial #8; //Method printHello:()V 
12: return 

} 여기

3

소리는 철학적 질문과 같습니다. Java 구현이 확실하지 않습니다.

this은 JLS에서 정의되며 Java의 키워드이며 컴파일은 해당 표준을 준수해야합니다. 당신이

object.method(args) 

같은 방법이있을 때 무엇을 실제로 바이트 코드라고하는 것은 보이는 방법이다

this은 첫 번째 인수 인
method(object, args); 

있다.

JVM 수준에서 매개 변수에는 이름이 없으며 실제로 사용되지 않는 경우 JIT에서 인수를 최적화 할 수 있습니다.

+0

:) 피터 없음. 질문과의 인터뷰에서 튕겨 나왔습니다. 그것을 밖으로 체크의 Thot. – mavrav

+0

인터뷰에서 가끔 어색한 질문을받는 경우가 있습니다. 면접관이 대답을 알지 못하는 표식 일 수도 있고, 당신이하는 말을 알고 싶어 할 수도 있습니다. –

+1

게시 작업이 JVM 구현 작업과 관련되어 있지 않다면 이는 끔찍한 질문입니다! – vaughandroid

7

로컬 변수 0 (기본적으로 레지스터 0)은 메소드가 호출 될 때 현재 오브젝트를 가리 킵니다. 컴파일러는 간단히 로컬 변수 0에 대한 별칭으로 this을 사용합니다.

그래서 대답은 컴파일러가 this을 구현한다는 것입니다.

관련 문제