2010-11-02 9 views
102

Je suis en train de faire de la programmation Android et je me renseignais sur Intents, quand j'ai vu un constructeur qui, à mon esprit entraîné par C#, semblait génial. L'appel était:Utiliser "this" avec le nom de la classe

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

Les deux paramètres sont nouveaux pour moi. Comment existe-t-il un ".this" statique d'un nom de classe? Est-ce une chose Java ou une chose Android? Je suppose que c'est la même chose que de dire "ceci", puisque je suis dans le contexte de CurrentActivity, mais je ne comprends pas comment le "ceci" peut être annulé du nom de classe lui-même. Aussi. Le ".class" a l'air d'être utilisé pour la réflexion, ce que je connais en C#, mais tout aperçu de ce sujet serait également bien accueilli.

Merci.

Répondre

122

Habituellement, vous ne pouvez utiliser que this. Mais, parfois this fait référence à une classe interne ... ainsi, par exemple:

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

Je vois. Donc, si j'avais juste dit "ceci" dans la nouvelle intention dans votre exemple, cela ferait référence à la "ceci" de la classe OnClickListener, mais comme je dois référencer la classe externe, j'ai besoin d'un moyen de le signifier. – skaz

+6

Droite. 'ceci 'est toujours la classe la plus intérieure. – Falmarri

+7

Et pour répondre à l'autre partie de la question: oui, c'est une chose de java – Decko

8

ClassName.this est utilisé pour référencer l'instance actuelle d'une classe externe d'une classe interne.

+0

Et certainement l'inverse? – codymanix

12

La syntaxe "Classname.this" est pour les classes internes. Si vous voulez vous référer à l'instance englobante de type "Outerclass" alors vous le faites comme "Outerclass.this".

NextActivity.class est simplement l'objet Class qui décrit la classe "NextActivity".

9

NextActivity.class en java signifie typeof(NextActivity) en C#

55

Un à la fois:

La première construction est appelée qualified this. Le but de la syntaxe est dans le cas où vous êtes dans une classe interne (typiquement une classe interne anonyme) et vous voulez référencer le this de la classe externe plutôt que le this de la classe interne (anonyme). Le "qualifié ceci" ne peut être utilisé que dans un contexte où this serait ambigu. La citation de JLS "C'est une erreur de compilation si l'expression se produit dans une classe ou une interface qui n'est pas une classe interne de classe T ou T elle-même".

La deuxième construction est appelée class literal est la manière de référencer l'objet Class qui représente ce type. Il peut être utilisé dans n'importe quel contexte.

+0

Il est à noter, si cette réponse n'est pas encore suffisamment claire, qu'elle ne fonctionne que lorsqu'il y a une classe fermée et que vous faites référence à une classe externe. Vous ne pouvez simplement pas utiliser "NotInTheStackOfEnclosings.this". –

+1

@DiegoNunes, cela est vrai de la 'qualifié ceci 'pas du' classe littérale'. J'ai élargi ma réponse pour le rendre plus clair. – Yishai

3
<ClassName>.this 

est utilisé dans les classes imbriquées pour se référer à l'instance actuelle de la classe englobante, puisque le mot-clé `ce fait référence à l'instance de classe de nid.

 
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

Il est déroutant seulement parce que lorsque vous utilisez "MainActivity.this", il semble que vous faites référence à la classe et non l'objet. En réalité, lorsque vous utilisez « ce » vous êtes toujours référence à l'objet courant, comme Java SE documentation indique:

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

Au sein d'une méthode d'instance ou un constructeur, ce est un référence à l'objet courant t - l'objet dont la méthode ou le constructeur est appelé. Vous pouvez faire référence à n'importe quel membre de l'objet actuel à partir d'une méthode d'instance ou d'un constructeur en l'utilisant.

C'est juste syntaxiquement particulier.