2010-11-02 16 views
102

Ich mache Android-Programmierung und lernte über Intents, als ich einen Konstruktor sah, der, zu meinem C# trainierten Geist, funky schien. Der Anruf war:Verwenden von "this" mit Klassennamen

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

Beide Parameter sind neu für mich. Wie gibt es eine statische ".this" von einem Klassennamen? Ist das eine Java-Sache oder eine Android-Sache? Ich gehe davon aus, dass es dasselbe ist wie "this" zu sagen, da ich im Kontext von CurrentActivity bin, aber ich verstehe nicht, wie das "dies" vom Klassennamen selbst entfernt werden kann. Ebenfalls. Die ".class" sieht aus, als ob sie für die Reflektion verwendet wird, was mir in C# vertraut ist, aber jeder Einblick wäre auch willkommen.

Danke.

Antwort

122

Regel nur this verwenden können. Aber manchmal macht this Bezug auf eine innere Klasse ... so zum Beispiel:

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

Ich sehe. Hätte ich in meinem Beispiel nur "this" im neuen Intent gesagt, würde dies auf das "This" der OnClickListener-Klasse verweisen, aber da ich auf die äußere Klasse verweisen muss, muss ich eine Möglichkeit haben, dies zu bezeichnen. – skaz

+6

Rechts. Das ist immer die innerste Klasse. – Falmarri

+7

Und um den anderen Teil der Frage zu beantworten: Ja, es ist eine Java-Sache – Decko

8

ClassName.this wird verwendet, um die aktuelle Instanz einer äußeren Klasse von einer inneren Klasse zu referenzieren.

+0

Und natürlich andersherum? – codymanix

12

Die Syntax "Classname.this" ist für innere Klassen. Wenn Sie auf die umschließende Instanz vom Typ "Outerclass" verweisen möchten, tun Sie dies als "Outerclass.this".

NextActivity.class ist einfach das Klassenobjekt, das die Klasse "NextActivity" beschreibt.

9

NextActivity.class in Java bedeutet typeof(NextActivity) in C#

55

One zu einem Zeitpunkt:

Das erste Konstrukt ist ein qualified this genannt. Der Zweck der Syntax ist in dem Fall, in dem Sie sich in einer inneren Klasse befinden (normalerweise eine anonyme innere Klasse) und auf die this der äußeren Klasse und nicht auf die this der (anonymen) inneren Klasse verweisen möchten. Das "Dies qualifiziert" kann nur in einem Kontext verwendet werden, in dem this mehrdeutig wäre. Das Zitat der JLS "Es ist ein Fehler bei der Kompilierung, wenn der Ausdruck in einer Klasse oder Schnittstelle auftritt, die keine innere Klasse der Klasse T oder T selbst ist".

Das zweite Konstrukt heißt class literal ist die Möglichkeit, auf das Klassenobjekt zu verweisen, das diesen Typ darstellt. Es kann in jedem Kontext verwendet werden.

+0

Es ist erwähnenswert, wenn diese Antwort immer noch nicht klar genug ist, dass es nur funktioniert, wenn es eine eingeschlossene Klasse gibt und Sie eine äußere Klasse referenzieren. Sie können "NotInTheStackOfEnclosings.this" einfach nicht verwenden. –

+1

@DiegoNunes, das gilt für das 'qualifizierte this' nicht vom' class literal'. Ich habe meine Antwort erweitert, um das klarer zu machen. – Yishai

3
<ClassName>.this 

wird in verschachtelten Klassen verwendet, um die aktuellen Instanz der umgebenden Klasse zu verweisen, da das `dieses Schlüsselwort auf die Instanz Nest Klasse bezieht.

 
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

Es ist verwirrend, weil nur, wenn Sie "MainActivity.this", so scheint es, dass Sie auf die Klasse beziehen und nicht auf das Objekt. In Wirklichkeit, wenn Sie „das“ Sie verwenden beziehen sich immer auf das aktuelle Objekt, als java se Dokumentation Zustände:

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

Innerhalb einer Instanzmethode oder einem Konstruktor, diese ist ein Referenz auf das aktuelle Objekt t - das Objekt, dessen Methode oder Konstruktor aufgerufen wird. Sie können auf jedes Mitglied des aktuellen Objekts innerhalb einer Instanzmethode oder eines Konstruktors verweisen, indem Sie dies verwenden.

Es ist nur syntaktisch eigenartig.

Verwandte Themen