클래스 이름과 함께 "this"사용


115

저는 Android 프로그래밍을하고 있고 Intents에 대해 배우고 있었는데, C # 훈련 된 마음에 펑키 해 보이는 생성자를 보았을 때. 전화 :

Intent myIntent = new Intent(CurrentActivity.this, NextActivity.class);

두 매개 변수 모두 나에게 새로운 것입니다. 클래스 이름에 정적 ".this"가있는 이유는 무엇입니까? 이것은 Java 또는 Android입니까? 의 컨텍스트에 있기 때문에 "this"를 말하는 것과 동일하다고 가정하고 CurrentActivity있지만 클래스 이름 자체에서 "this"가 어떻게 호출 될 수 있는지 이해하지 못합니다. 또한. ".class"는 리플렉션에 사용되는 것처럼 보이며 C #에서 익숙하지만 이에 대한 통찰력도 환영합니다.

감사.

답변:


138

일반적으로 this. 그러나 때때로 this내부 클래스를 참조합니다. 예를 들면 다음과 같습니다.

Button button = (Button)findViewById(R.id.ticket_details_sell_ticket);
button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        // it will be wrong to use only "this", because it would
        // reference the just created OnClickListener object
        Intent login = new Intent(ClassName.this, Login.class);
        startActivityForResult(login, LOGIN_REQUEST);
    }
});

17
내가 참조. 그래서 당신의 예제의 새로운 Intent에서 방금 "this"라고 말했 더라면 OnClickListener 클래스의 "this"를 참조하는 것입니다.하지만 외부 클래스를 참조해야하므로이를 나타내는 방법이 필요합니다.
skaz

7
권리. this항상 가장 안쪽 클래스입니다.
Falmarri 2010

7
그리고 질문의 다른 부분에 대답 : 예, 그것은 자바 일이
Decko

1
왜 그런지 궁금 MyClass.this을 하고뿐만 아니라 리스너를 등록 할 때에! 감사합니다
luigi7up

3
이상한! Java가 thisJavaScript와 매우 흡사 하다는 것을 누가 알았 this습니까? 나는 그것이 일류 함수 나 람다를 가지지 않은 것에 대해 당신이 얻는 것 같아요 :-)
Pat

61

한번에 한:

첫 번째 구성은 정규화 된 this 라고합니다 . 구문의 목적은 내부 클래스 (일반적으로 익명 내부 클래스) 에 있고 (익명) 내부 클래스가 this아닌 외부 클래스 를 참조하려는 경우 입니다 this. "qualified this"는 this모호한 컨텍스트에서만 사용할 수 있습니다 . JLS "표현식이 클래스 T 또는 T 자체의 내부 클래스가 아닌 클래스 또는 인터페이스에서 발생하면 컴파일 시간 오류입니다."

두 번째 구문은 class literal해당 유형을 나타내는 Class 객체를 참조하는 방법입니다. 모든 컨텍스트에서 사용할 수 있습니다.


이 답변이 아직 명확하지 않은 경우 동봉 된 클래스가 있고 외부 클래스를 참조 할 때만 작동한다는 점에 주목할 가치가 있습니다. "NotInTheStackOfEnclosings.this"를 사용할 수 없습니다.
diego nunes

1
@DiegoNunes qualified thisclass literal. 나는 그것을 더 명확하게하기 위해 내 대답을 확장했습니다.
Yishai

14

"Classname.this"구문은 내부 클래스 용입니다. "Outerclass"유형의 엔 클로징 인스턴스를 참조하려면 "Outerclass.this"로 수행합니다.

NextActivity.class는 단순히 "NextActivity"클래스를 설명하는 Class 객체입니다.


11

NextActivity.class자바 typeof(NextActivity)에서 C #에서 의미


8

ClassName.this 내부 클래스에서 외부 클래스의 현재 인스턴스를 참조하는 데 사용됩니다.


그리고 확실히 그 반대?
codymanix 2010

5
<ClassName>.this

`this '키워드는 중첩 클래스 인스턴스를 참조하기 때문에 중첩 클래스에서 둘러싸는 클래스의 현재 인스턴스를 참조하는 데 사용됩니다.

public class Siht { class NestedSiht { void demoThis () { System . err . println ( " Siht.this '는 다음의 인스턴스입니다 :" + Siht . this . getClass (). getName ()); } }   
      
         
            this' is an instance of: " + 
                            this.getClass().getName());
            System.err.println(" 
                            
        
    

void demoThis() {
    new java.lang.Object() {
        void demoThis() {
            System.err.println("`this' is an instance of: " + 
                            this.getClass().getName());
            System.err.println("`Siht.this' is an instance of: " +
                            Siht.this.getClass().getName());
        }
    }.demoThis();
    new NestedSiht().demoThis();
}

public static void main(String [] args) {
    new Siht().demoThis();
}

}


0

" MainActivity.this " 를 사용할 때 객체가 아닌 클래스를 참조하는 것처럼 보이기 때문에 혼란 스럽습니다 . 실제로 "this"를 사용할 때 java se 문서에 나와있는 것처럼 항상 현재 객체를 참조하는 것입니다.

https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html

인스턴스 메서드 또는 생성자 내에서 이것은 현재 objec t (메소드 또는 생성자가 호출되는 객체 )에 대한 참조 입니다. 이를 사용하여 인스턴스 메서드 또는 생성자 내에서 현재 개체의 모든 멤버를 참조 할 수 있습니다.

그것은 단지 구문 적으로 독특합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.