【问题标题】:Using "this" with class name将“this”与类名一起使用
【发布时间】:2023-03-16 12:40:01
【问题描述】:

我正在做 Android 编程并且正在学习 Intents,当我看到一个构造函数,在我受过 C# 训练的头脑中,它看起来很时髦。电话是:

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

这两个参数对我来说都是新的。类名中如何存在静态“.this”?这是Java的东西还是Android的东西?我假设它与只是说“this”相同,因为我在CurrentActivity 的上下文中,但我不明白如何从类名本身中调用“this”。还。 “.class”看起来像是用于反射,我在 C# 中很熟悉,但也欢迎对此的任何见解。

谢谢。

【问题讨论】:

    标签: java android this


    【解决方案1】:

    通常,您只能使用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);
        }
    });
    

    【讨论】:

    • 我明白了。因此,如果我刚刚在您的示例中的新 Intent 中说“this”,它将指的是 OnClickListener 类的“this”,但由于我需要引用外部类,所以我需要一种方法来表示它。
    • 对。 this 始终是最里面的类。
    • 回答问题的另一部分:是的,这是一个 java 的东西
    • 我想知道为什么在注册监听器时使用 MyClass.this 而不仅仅是 this !谢谢
    • 好笑!谁知道 Java 的 this 和 JavaScript 的 this 如此相似?我想这就是你没有一流的函数或 lambdas 的结果:-)
    【解决方案2】:

    一次一个:

    第一个构造称为qualified this。语法的目的是在您处于内部类(通常是匿名内部类)中并且您想要引用外部类的this 而不是(匿名)内部类的this 的情况下。 "qualified this" 只能在 this 不明确的情况下使用。引用 JLS “如果表达式出现在不是类 T 或 T 本身的内部类的类或接口中,则这是编译时错误”。

    第二个构造称为class literal 是引用表示该类型的Class 对象的方式。它可以在任何情况下使用。

    【讨论】:

    • 值得注意的是,如果这个答案仍然不够清楚,它只在有一个封闭的类并且你引用一个外部类时才有效。你根本不能使用“NotInTheStackOfEnclosures.this”。
    • @DiegoNunes,qualified this 不是 class literal。我已经扩展了我的答案以使其更清楚。
    【解决方案3】:

    语法“Classname.this”用于内部类。如果你想引用类型为“Outerclass”的封闭实例,那么你可以使用“Outerclass.this”。

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

    【讨论】:

      【解决方案4】:

      NextActivity.class 在 java 中的意思是 typeof(NextActivity) 在 C# 中

      【讨论】:

        【解决方案5】:

        ClassName.this 用于从内部类引用外部类的当前实例。

        【讨论】:

        • 当然反过来?
        【解决方案6】:
        <ClassName>.this
        

        在嵌套类中用于引用封闭类的当前实例,因为 `this' 关键字引用嵌套类实例。

        公共类 Siht { 类 NestedSiht { 无效 demoThis() { System.err.println("this' is an instance of: " + this.getClass().getName()); System.err.println("Siht.this' 是一个实例:" + 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();
        }
        

        }

        【讨论】:

          【解决方案7】:

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

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

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

          这只是语法上的特殊。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-07-29
            • 1970-01-01
            • 2013-05-31
            • 1970-01-01
            • 2020-01-04
            相关资源
            最近更新 更多