Usando “this” com o nome da classe

115

Estou fazendo programação para Android e aprendendo sobre Intents, quando vi um construtor que, para minha mente treinada em C #, parecia descolado. A chamada foi:

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

Ambos os parâmetros são novos para mim. Como existe um ".this" estático fora de um nome de classe? Isso é coisa do Java ou do Android? Estou assumindo que é o mesmo que dizer "isso", já que estou no contexto de CurrentActivity, mas não entendo como o "isso" pode ser evitado no próprio nome da Classe. Além disso. O ".class" parece ser usado para reflexão, com o qual estou familiarizado em C #, mas qualquer ideia sobre isso seria bem-vinda.

Obrigado.

Skaz
fonte

Respostas:

138

Normalmente, você pode usar apenas this. Mas, às vezes thisfaz referência a uma classe interna ... então, por exemplo:

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
fonte
17
Entendo. Então, se eu tivesse acabado de dizer "this" no novo Intent em seu exemplo, estaria se referindo a "this" da classe OnClickListener, mas como preciso fazer referência à classe externa, preciso de uma maneira de significar isso.
Skaz
7
Certo. thisé sempre a classe mais interna.
Falmarri
7
E para responder a outra parte da pergunta: sim, é uma coisa java
Decko
1
Eu queria saber por que MyClass.isso e não apenas isso ao registrar um ouvinte! Obrigado
luigi7up
3
Engraçado! Quem diria que o Java é thistão parecido com o JavaScript this? Eu acho que é isso que você ganha por não ter funções de primeira classe ou lambdas :-)
Pat
61

Um por vez:

A primeira construção é chamada de qualificado this . O objetivo da sintaxe é no caso em que você está em uma classe interna (normalmente uma classe interna anônima) e deseja fazer referência a thisda classe externa em vez dethis da classe interna (anônima). O "qualificou isso" só pode ser usado em um contexto em thisque seria ambíguo. A citação do JLS "É um erro em tempo de compilação se a expressão ocorre em uma classe ou interface que não é uma classe interna da própria classe T ou T".

A segunda construção é chamada de class literalé a maneira de fazer referência ao objeto Class que representa aquele tipo. Ele pode ser usado em qualquer contexto.

Yishai
fonte
É importante notar, se esta resposta ainda não estiver suficientemente clara, que só funciona quando há uma classe fechada e você está se referindo a uma classe externa. Você simplesmente não pode usar "NotInTheStackOfEnclosings.this".
diego nunes
1
@DiegoNunes, isso vale para o qualified thisnão class literal. Ampliei minha resposta para tornar isso mais claro.
Yishai
14

A sintaxe "Classname.this" é para classes internas. Se você quiser se referir à instância envolvente do tipo "Outerclass", faça-o como "Outerclass.this".

NextActivity.class é simplesmente o objeto Class que descreve a classe "NextActivity".

DJClayworth
fonte
11

NextActivity.classem java significa typeof(NextActivity)em C #

codymanix
fonte
8

ClassName.this é usado para fazer referência à instância atual de uma classe externa de uma classe interna.

akf
fonte
E certamente o contrário?
codymanix
5
<ClassName>.this

é usado em classes aninhadas para se referir à instância atual da classe envolvente, uma vez que a palavra-chave `this 'se refere à instância da classe aninhada.

public class Siht { class NestedSiht { void demoThis () { System . err . println ( " Siht.this 'é uma instância de:" + 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();
}

}

Khachik
fonte
0

É confuso apenas porque quando você usa " MainActivity.this ", parece que você está se referindo à classe e não ao objeto. Na realidade, quando você usa "this", está sempre se referindo ao objeto atual, como afirma a documentação do Java:

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

Dentro de um método de instância ou construtor, esta é uma referência ao objeto atual - o objeto cujo método ou construtor está sendo chamado. Você pode se referir a qualquer membro do objeto atual a partir de um método de instância ou um construtor usando this.

É apenas sintaticamente peculiar.

Caetano
fonte