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.
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);
}
});
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.
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".
NextActivity.class
En Java signifie typeof(NextActivity)
en C #
ClassName.this
est utilisé pour référencer l'instance actuelle d'une classe externe à partir d'une classe interne.
<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();
}
}
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.