Usando "esto" con el nombre de la clase

115

Estoy haciendo programación de Android y estaba aprendiendo sobre Intents, cuando vi un constructor que, para mi mente entrenada en C #, parecía funky. La llamada fue:

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

Ambos parámetros son nuevos para mí. ¿Cómo hay un ".this" estático fuera de un nombre de clase? ¿Es esto algo de Java o 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 llamar "esto" del nombre de la clase en sí. También. El ".class" parece que se usa para la reflexión, con lo que estoy familiarizado en C #, pero cualquier idea sobre esto también sería bienvenida.

Gracias.

skaz
fuente

Respuestas:

138

Por lo general, solo puede usar this. Pero, a veces thishace 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);
    }
});
Cristian
fuente
17
Veo. Entonces, si acabo de decir "esto" en el nuevo Intent en su ejemplo, se estaría refiriendo a "esto" de la clase OnClickListener, pero como necesito hacer referencia a la clase externa, necesito una forma de indicar eso.
skaz
7
Correcto. thises siempre la clase más interna.
Falmarri
7
Y para responder a la otra parte de la pregunta: sí, es una cosa de Java
Decko
1
Me preguntaba por qué MyClass.this y no solo esto al registrar un oyente. Gracias
luigi7up
3
¡Gracioso! ¿Quién sabía que Java thisse parecía tanto a JavaScript this? Supongo que eso es lo que obtienes por no tener funciones de primera clase o lambdas :-)
Pat
61

Uno a la vez:

La primera construcción se llama esto calificado . El propósito de la sintaxis es en el caso de que se encuentre en una clase interna (normalmente una clase interna anónima) y desee hacer referencia a la thisde la clase externa en lugar de la thisde la clase interna (anónima). El "calificado esto" sólo se puede utilizar en un contexto en el thisque sería ambiguo. La cita de 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í misma".

La segunda construcción se llama a class literales la forma de hacer referencia al objeto Class que representa ese tipo. Se puede utilizar en cualquier contexto.

Yishai
fuente
Vale la pena señalar, si esta respuesta aún no es lo suficientemente clara, que solo funciona cuando hay una clase encerrada y se hace referencia a una clase externa. Simplemente no puede utilizar "NotInTheStackOfEnclosings.this".
diego nunes
1
@DiegoNunes, eso es cierto del qualified thisno de class literal. He ampliado mi respuesta para que quede más claro.
Yishai
14

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

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

DJClayworth
fuente
11

NextActivity.classen Java significa typeof(NextActivity)en C #

codymanix
fuente
8

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

akf
fuente
¿Y ciertamente al revés?
codymanix
5
<ClassName>.this

se usa en clases anidadas para referirse a la instancia actual de la clase adjunta, ya que la palabra clave 'this' se refiere a la instancia de la clase nest.

public class Siht { class Siht {  
    class NestedSiht {class NestedSiht {  
        void demoThis () {void demoThis () { 
            System.err.println (" Siht.this 'es una instancia de:" +Sistema . err . println ( " +this' is an instance of: " + 
                            this.getClass().getName());
            System.err.println(" 
                            Siht.this.getClass (). GetName ());Siht . esto . 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();
}

}

Khachik
fuente
0

Es confuso solo porque cuando usa " MainActivity.this ", parece que se está refiriendo a la clase y no al objeto. En realidad, cuando usa "this" siempre se está refiriendo al objeto actual, como dice la documentación de java se:

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

Dentro de un método de instancia o un constructor, esta es una referencia al objeto actual : el objeto cuyo método o constructor se está llamando. Puede hacer referencia a cualquier miembro del objeto actual desde dentro de un método de instancia o un constructor usando this.

Es sintácticamente peculiar.

Gaetano
fuente