web-dev-qa-db-fra.com

Utilisation de "this" avec le nom de la classe

Je fais de la programmation Android et j'apprenais à connaître Intents, quand j'ai vu un constructeur qui, pour mon esprit formé en C #, semblait génial. L'appel était:

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

Les deux paramètres sont nouveaux pour moi. Comment existe-t-il un ".this" statique hors d'un nom de classe? Est-ce une chose Java chose ou une chose Android chose? Je suppose que c'est la même chose que de dire "ceci", puisque je suis dans le contexte de CurrentActivity, mais je ne sais pas comment le "this" peut être appelé hors du nom de la classe lui-même. De plus, le ".class" semble être utilisé pour la réflexion, ce que je connais en C # , mais toute information à ce sujet serait également la bienvenue.

Merci.

112
skaz

En règle générale, vous ne pouvez utiliser que this. Mais, parfois this fait référence à une classe interne ... donc, 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);
    }
});
134
Cristian

Un à la fois:

La première construction est appelée qualifiée ceci . Le but de la syntaxe est dans le cas où vous êtes dans une classe interne (généralement une classe interne anonyme) et que vous souhaitez référencer le this de la classe externe plutôt que le this du (anonyme) classe interne. Le "qualifié ceci" ne peut être utilisé que dans un contexte où this serait ambigu. La citation du 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 la classe T ou T elle-même".

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

59
Yishai

La syntaxe "Classname.this" est pour les classes internes. Si vous voulez faire référence à l'instance englobante de type "Outerclass", vous le faites en tant que "Outerclass.this".

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

13
DJClayworth

NextActivity.class En Java signifie typeof(NextActivity) en C #

11
codymanix

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

8
akf
<ClassName>.this

est utilisé dans les classes imbriquées pour faire référence à l'instance actuelle de la classe englobante, car le mot-clé `this 'fait référence à l'instance de classe nest.

 classe publique Siht {
 classe NestedSiht {
 void demoThis () {
 System.err.println ("this' is an instance of: " + 
                            this.getClass().getName());
            System.err.println("Siht.this 'est une instance de: "+ 
 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();
}

}
4
khachik

C'est déroutant uniquement 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 "this", vous faites toujours référence à l'objet actuel, comme l'indique la documentation Java se:

https://docs.Oracle.com/javase/tutorial/Java/javaOO/thiskey.html

Dans une méthode d'instance ou un constructeur, ceci est une 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 utilisant ceci.

C'est juste syntaxiquement particulier.

0
Gaetano