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.

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

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.


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”.



8

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


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

}


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.