Używanie „this” z nazwą klasy

115

Zajmuję się programowaniem na Androida i uczyłem się o intencjach, kiedy zobaczyłem konstruktora, który moim wyszkolonym w C # umyśle wydawał się funky. Wezwanie brzmiało:

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

Oba parametry są dla mnie nowe. W jaki sposób istnieje statyczne „.this” poza nazwą klasy? Czy to sprawa Javy czy Androida? Zakładam, że to to samo, co zwykłe powiedzenie „tego”, ponieważ jestem w kontekście CurrentActivity, ale nie rozumiem, w jaki sposób „to” może być odwołane z samej nazwy klasy. Również. ".Class" wygląda tak, jakby służył do refleksji, którą znam w C #, ale każdy wgląd w to również byłby mile widziany.

Dzięki.

skaz
źródło

Odpowiedzi:

138

Zwykle możesz użyć tylko this. Ale czasami thisodwołuje się do klasy wewnętrznej ... na przykład:

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);
    }
});
Cristian
źródło
17
Widzę. Gdybym właśnie powiedział „this” w nowej intencji w waszym przykładzie, odnosiłoby się to do „this” klasy OnClickListener, ale ponieważ muszę odwołać się do klasy zewnętrznej, potrzebuję sposobu, aby to zaznaczyć.
skaz
7
Dobrze. thisjest zawsze najbardziej wewnętrzną klasą.
Falmarri
7
I odpowiadając na drugą część pytania: tak, to sprawa Java
Decko,
1
Zastanawiałem się, dlaczego MyClass.this i nie tylko to w trakcie rejestracji słuchacza! Dzięki
luigi7up
3
Zabawny! Kto wiedział, że Java jest thistak bardzo podobna do JavaScript this? Wydaje mi się, że to właśnie dostajesz, nie mając funkcji pierwszej klasy ani lambd :-)
Pat.
61

Pojedynczo:

Pierwsza konstrukcja jest nazywana kwalifikowaną this . Zadaniem składni jest sytuacja, w której znajdujesz się w klasie wewnętrznej (zwykle jest to anonimowa klasa wewnętrzna) i chcesz odwołać się thisdo klasy zewnętrznej, a nie thisdo (anonimowej) klasy wewnętrznej. „Kwalifikowane to” może być używane tylko w kontekście, w którym thisbyłoby to niejednoznaczne. Cytuje JLS "Jest to błąd czasu kompilacji, jeśli wyrażenie występuje w klasie lub interfejsie, który nie jest wewnętrzną klasą klasy T lub T".

Druga konstrukcja nosi nazwę a i class literaljest sposobem odwoływania się do obiektu Class, który reprezentuje ten typ. Może być używany w dowolnym kontekście.

Yishai
źródło
Warto zauważyć, że jeśli ta odpowiedź nadal nie jest wystarczająco jasna, to działa tylko wtedy, gdy istnieje klasa zamknięta i odwołujesz się do klasy zewnętrznej. Po prostu nie możesz użyć „NotInTheStackOfEnclosings.this”.
diego nunes
1
@DiegoNunes, to prawda o qualified thisnie z class literal. Rozszerzyłem moją odpowiedź, aby była jaśniejsza.
Yishai
14

Składnia „Classname.this” dotyczy klas wewnętrznych. Jeśli chcesz odwołać się do otaczającej instancji typu „Outerclass”, zrób to jako „Outerclass.this”.

NextActivity.class to po prostu obiekt Class, który opisuje klasę „NextActivity”.

DJClayworth
źródło
11

NextActivity.classw java oznacza typeof(NextActivity)w C #

codymanix
źródło
8

ClassName.this służy do odwoływania się do bieżącego wystąpienia klasy zewnętrznej z klasy wewnętrznej.

akf
źródło
A na pewno na odwrót?
codymanix
5
<ClassName>.this

jest używane w klasach zagnieżdżonych do odwoływania się do bieżącej instancji klasy otaczającej, ponieważ słowo kluczowe `this 'odnosi się do instancji klasy zagnieżdżonej.

klasa publiczna Siht { class Siht {  
    class NestedSiht {class NestedSiht {  
        void demoThis () {void demoThis () { 
            System.err.println (" Siht.this" jest przykładem: "+System . błądzić . println ( " +this' is an instance of: " + 
                            this.getClass().getName());
            System.err.println(" 
                            Siht.this.getClass (). GetName ());Siht . to . getClass (). getName ());
        }}
    }}

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();
}

}

chaczik
źródło
0

Jest to mylące tylko dlatego, że kiedy używasz " MainActivity.this ", wydaje się, że odnosisz się do klasy, a nie do obiektu. W rzeczywistości, kiedy używasz "this", zawsze odnosisz się do aktualnego obiektu, jak stwierdza dokumentacja java se:

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

W ramach metody np lub konstruktora, to jest odniesieniem dla obecnego objec t - obiekt, którego metoda lub konstruktora jest wywoływana. Możesz odwołać się do dowolnego elementu członkowskiego bieżącego obiektu z poziomu metody wystąpienia lub konstruktora, używając this.

Jest to po prostu osobliwe pod względem składniowym.

Gaetano
źródło