2010-11-02 11 views
102

Robię programowanie Android i uczyłem się o intencjach, kiedy zobaczyłem konstruktora, który moim wyszkolonym umysłowo wyglądał na funky. Wywołanie:Używając "tego" z nazwą klasy

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

Oba parametry są dla mnie nowe. Jak jest statyczny ".this" od nazwy klasy? Czy to jest rzecz Java lub coś na Androida? Zakładam, że to jest to samo, co po prostu mówienie "to", ponieważ jestem w kontekście CurrentActivity, ale nie rozumiem, jak "to" można wywołać z samej nazwy klasy. Również. Wygląda na to, że ".class" jest używany do refleksji, którą znam w C#, ale każdy wgląd w to również byłby mile widziany.

Dzięki.

Odpowiedz

122

Zazwyczaj można użyć tylko this. Ale czasami this odnosi się do wewnętrznej klasie ... tak, 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); 
    } 
}); 
+16

Rozumiem. Tak więc, po prostu powiedziałem "to" w nowej intencji w twoim przykładzie, odnosiło się to do "tego" klasy OnClickListener, ale ponieważ potrzebuję odniesienia do zewnętrznej klasy, potrzebuję sposobu, aby to zaznaczyć. – skaz

+6

Dobrze. "to" jest zawsze najgłębszą klasą. – Falmarri

+7

I odpowiedzieć na drugą część pytania: tak, to jest java rzecz – Decko

8

ClassName.this służy do odniesienia do bieżącej instancji klasy zewnętrznej z klasy wewnętrznej.

+0

I na pewno na odwrót? – codymanix

12

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

NextActivity.class to po prostu obiekt klasy opisujący klasę "NextActivity".

9

NextActivity.class w java Oznacza typeof(NextActivity) w C#

55

Jedna naraz:

Pierwszy konstrukt jest nazywany qualified this. Celem składni jest przypadek, w którym znajdujesz się w klasie wewnętrznej (zazwyczaj anonimowej klasie wewnętrznej) i chcesz odwoływać się do klasy zewnętrznej, a nie do klasy wewnętrznej (anonimowej) klasy this. "Zakwalifikowany to" może być używany tylko w kontekście, w którym this byłoby niejednoznaczne. Cytuj JLS "Jest to błąd podczas kompilacji, jeśli wyrażenie występuje w klasie lub interfejsie, który nie jest wewnętrzną klasą samej klasy T lub T".

Druga konstrukcja nazywa się class literal jest sposobem na odniesienie do obiektu klasy, który reprezentuje ten typ. Może być używany w dowolnym kontekście.

+0

Warto zauważyć, że jeśli ta odpowiedź nadal nie jest jasna, to działa ona tylko wtedy, gdy istnieje zamknięta klasa i odwołujesz się do zewnętrznej klasy. Po prostu nie można użyć "NotInTheStackOfEnclosings.this". –

+1

@DiegoNunes, co jest prawdą w przypadku "kwalifikowanego tego", a nie "klasy dosłownej". Rozszerzyłem moją odpowiedź, aby to wyjaśnić. – Yishai

3
<ClassName>.this 

służy klas zagnieżdżonych w odniesieniu do bieżącej instancji klasy okalającego, ponieważ `to słowo kluczowe odnosi się do instancji klasy gniazdo.

 
public class Siht { 
    class NestedSiht { 
     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()); 
     } 
    }

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

To mylące, ponieważ kiedy tylko użyć "MainActivity.this", wydaje się, że odnosimy się do klasy, a nie obiekt. W rzeczywistości, kiedy użyć „to” jesteś zawsze odnosząc się do bieżącego obiektu, jak Java SE stany dokumentacja:

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

ciągu metody instancji lub konstruktora, ten jest referencja do bieżącego obiektu t - obiekt, którego metoda lub konstruktor jest wywoływany. Możesz odwołać się do dowolnego elementu bieżącego obiektu, korzystając z metody instancji lub konstruktora.

To jest po prostu syntaktycznie osobliwa.

Powiązane problemy