Utilizzo di "questo" con il nome della classe


115

Sto facendo programmazione Android e stavo imparando a conoscere Intents, quando ho visto un costruttore che, alla mia mente addestrata in C #, sembrava funky. La chiamata era:

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

Entrambi i parametri sono nuovi per me. Come può esserci un ".this" statico in un nome di classe? È una cosa Java o una cosa Android? Presumo che sia lo stesso che dire "questo", poiché sono nel contesto di CurrentActivity, ma non capisco come il "questo" possa essere richiamato dal nome stesso della classe. Anche. Il ".class" sembra essere utilizzato per la riflessione, che ho familiarità con in C #, ma qualsiasi intuizione in questo sarebbe benvenuta.

Grazie.

Risposte:


138

Di solito puoi usare solo this. Ma a volte thisfa riferimento a una classe interna ... quindi, ad esempio:

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);
    }
});

17
Vedo. Quindi avevo appena detto "questo" nel nuovo intento nel tuo esempio, si riferirebbe al "questo" della classe OnClickListener, ma poiché ho bisogno di fare riferimento alla classe esterna, ho bisogno di un modo per indicarlo.
skaz

7
Destra. thisè sempre la classe più intima.
Falmarri

7
E per rispondere all'altra parte della domanda: sì, è una cosa Java
Decko

1
Mi chiedevo perché MyClass.questo e non solo questo quando si registra un ascoltatore! Grazie
luigi7up

3
Divertente! Chi sapeva che Java thisera così simile a JavaScript this? Immagino che sia quello che ottieni per non avere funzioni o lambda di prima classe :-)
Pat

61

Uno alla volta:

Il primo costrutto è chiamato qualificato this . Lo scopo della sintassi è nel caso in cui ci si trovi in ​​una classe interna (tipicamente una classe interna anonima) e si desidera fare riferimento alla thisclasse esterna anziché a quella thisdella classe interna (anonima). Il "qualificato questo" può essere utilizzato solo in un contesto in cui thissarebbe ambiguo. La citazione JLS "È un errore in fase di compilazione se l'espressione si verifica in una classe o interfaccia che non è una classe interna della classe T o T stessa".

Il secondo costrutto è chiamato a class literalè il modo per fare riferimento all'oggetto Class che rappresenta quel tipo. Può essere utilizzato in qualsiasi contesto.


Vale la pena notare, se questa risposta non è ancora abbastanza chiara, che funziona solo quando c'è una classe chiusa e si fa riferimento a una classe esterna. Semplicemente non puoi usare "NotInTheStackOfEnclosings.this".
diego nunes

1
@DiegoNunes, questo è vero per il qualified thisnon del class literal. Ho ampliato la mia risposta per renderlo più chiaro.
Yishai

14

La sintassi "Classname.this" è per le classi interne. Se vuoi fare riferimento all'istanza che lo racchiude di tipo "Outerclass", fallo come "Outerclass.this".

NextActivity.class è semplicemente l'oggetto Class che descrive la classe "NextActivity".


11

NextActivity.classin java significa typeof(NextActivity)in C #


8

ClassName.this viene utilizzato per fare riferimento all'istanza corrente di una classe superiore da una classe interna.


E certamente il contrario?
codymanix

5
<ClassName>.this

viene utilizzata nelle classi annidate per fare riferimento all'istanza corrente della classe che la racchiude, poiché la parola chiave "this" si riferisce all'istanza della classe annidata.

public class Siht { class NestedSiht { void demoThis () { System . err . println ( " Siht.this 'è un'istanza di:" + Siht . this . getClass (). getName ()); } }   
      
         
            this' is an instance of: " + 
                            this.getClass().getName());
            System.err.println(" 
                            
        
    

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

È fonte di confusione solo perché quando usi " MainActivity.this ", sembra che ti riferisci alla classe e non all'oggetto. In realtà quando usi "this" ti riferisci sempre all'oggetto corrente, come afferma la documentazione di java se:

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

All'interno di un metodo di istanza o di un costruttore, questo è un riferimento all'oggetto corrente , l'oggetto il cui metodo o costruttore viene chiamato. Puoi fare riferimento a qualsiasi membro dell'oggetto corrente dall'interno di un metodo di istanza o di un costruttore usando this.

È solo sintatticamente peculiare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.