使用“ this”和类名


115

我正在做Android编程,并且正在学习有关Intent的知识,当时我看到一个构造函数,对我的C#而言,这看起来很时髦。电话是:

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

这两个参数对我来说都是新的。类名中如何有一个静态的“ .this”?这是Java还是Android?我假设这与只是说“ this”相同,因为我处于的上下文中CurrentActivity,但是我不知道如何从Class名称本身中调用“ this”。也。“ .class”看起来像是用于反射的,我在C#中很熟悉,但是对此的任何见识也将受到欢迎。

谢谢。

Answers:


138

通常,您只能使用this。但是,有时this会引用一个内部类...因此,例如:

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
我懂了。因此,在您的示例中,我只是在新的Intent中说了“ this”,所以它指的是OnClickListener类的“ this”,但是由于我需要引用外部类,因此需要一种方法来表明这一点。
skaz

7
对。this永远是最内在的阶级。
法尔玛里

7
并回答问题的另一部分:是的,这是一个Java问题
Decko 2011年

1
我想知道为什么在注册侦听器时,为什么要使用MyClass.this,而不仅仅是!谢谢
luigi7up 2013年

3
滑稽!谁知道Java this非常像JavaScript this?我想这就是没有一流功能或lambdas的结果:-)
帕特

61

一次一个:

第一个构造称为合格this。语法的目的是在您处于内部类(通常是匿名内部类)中并且您要引用this外部类而不是this(匿名)内部类的情况下。“限定此”只能在this模棱两可的环境中使用。引用JLS“如果表达式出现在不是类T或T本身的内部类的类或接口中,则是编译时错误”。

第二种构造称为a class literal是引用表示该类型的Class对象的方法。它可以在任何上下文中使用。


值得注意的是,如果此答案仍然不够清晰,则它仅在存在封闭类且您引用外部类时才有效。您根本无法使用“ NotInTheStackOfEnclosings.this”。
diego nunes

1
@DiegoNunes,对的qualified this不是class literal。我扩大了答案,使之更清楚。
Yishai

14

语法“ Classname.this”适用于内部类。如果要引用类型为“ Outerclass”的封闭实例,则将其称为“ Outerclass.this”。

NextActivity.class只是描述类“ NextActivity”的Class对象。




5
<ClassName>.this

在嵌套类中使用“”来引用封闭类的当前实例,因为“ this”关键字引用了嵌套类的实例。

公共Siht { NestedSiht { void demoThis (){ 系统错误的println Siht.this'是的一个实例:” + SIHT 的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

只是因为当您使用“ MainActivity.this ”时,您似乎是在指的是类而不是对象。实际上,当您使用“ this”时,您总是引用当前对象,如java se文档所述:

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

在实例方法或构造函数中,对当前objec t 的引用- 当前正在调用其方法或构造函数的对象。您可以使用实例方法或构造函数来引用当前对象的任何成员。

这只是语法上的特殊。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.