2010-11-02 9 views
102

Estoy haciendo la programación de Android y estaba aprendiendo acerca de Intents, cuando vi un constructor que, para mi mente entrenada en C#, parecía funky. La llamada fue:Usando "esto" con el nombre de clase

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

Ambos parámetros son nuevos para mí. ¿Cómo está un ".this" estático fuera de un Nombre de clase? ¿Es esto algo de Java o algo de Android? Supongo que es lo mismo que decir "esto", ya que estoy en el contexto de CurrentActivity, pero no entiendo cómo se puede cancelar "esto" con el nombre de la clase. También. La ".clase" parece que se usa para la reflexión, con la que estoy familiarizado en C#, pero cualquier idea sobre esto sería bienvenida también.

Gracias.

Respuesta

122

Por lo general, sólo se puede utilizar this. Pero, a veces this hace referencia a una clase interna ... así, por ejemplo:

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

Ya veo. Entonces, si acabara de decir "esto" en el nuevo Intento en su ejemplo, se estaría refiriendo al "esto" de la clase OnClickListener, pero dado que necesito hacer referencia a la clase externa, necesito una forma de expresar eso. – skaz

+6

Derecha. 'this' es siempre la clase más interna. – Falmarri

+7

Y para responder la otra parte de la pregunta: sí, es una cosa java – Decko

8

ClassName.this se utiliza para hacer referencia a la instancia actual de una clase exterior de una clase interna.

+0

¿Y ciertamente al revés? – codymanix

12

La sintaxis "Classname.this" es para clases internas. Si desea hacer referencia a la instancia adjunta de tipo "Outerclass", entonces hágalo como "Outerclass.this".

NextActivity.class es simplemente el objeto Class que describe la clase "NextActivity".

9

NextActivity.class en Java significa que typeof(NextActivity) en C#

55

Uno a la vez:

La primera construcción se denomina qualified this. El propósito de la sintaxis es el caso en el que se encuentre en una clase interna (normalmente una clase interna anónima) y desee hacer referencia al this de la clase externa en lugar de al this de la clase interna (anónima). El "calificado esto" solo se puede usar en un contexto donde this sería ambiguo. La cita del JLS "Es un error en tiempo de compilación si la expresión ocurre en una clase o interfaz que no es una clase interna de la clase T o T en sí".

La segunda construcción se llama class literal, es la forma de referenciar el objeto Clase que representa ese tipo. Se puede usar en cualquier contexto.

+0

Vale la pena señalar, si esta respuesta aún no es lo suficientemente clara, que solo funciona cuando hay una clase cerrada y está haciendo referencia a una clase externa. Simplemente no puede usar "NotInTheStackOfEnclosings.this". –

+1

@DiegoNunes, eso es cierto del 'calificado this' no del' class literal'. He ampliado mi respuesta para que quede más claro. – Yishai

3
<ClassName>.this 

se utiliza en clases anidadas para referirse a la instancia actual de la clase envolvente, ya que el esta palabra clave `refiere a la instancia de clase nido.

 
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 confuso sólo porque cuando se utiliza "MainActivity.this", parece que se está refiriendo a la clase y no el objeto. En realidad cuando se utiliza "este" siempre se está haciendo referencia al objeto actual, como el Java SE estados de documentación:

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

Dentro de un método de instancia o de un constructor, este es una referencia al objec actual t - el objeto cuyo método o constructor se está llamando. Puede hacer referencia a cualquier miembro del objeto actual desde un método de instancia o un constructor usando esto.

Es sintácticamente peculiar.

Cuestiones relacionadas