【问题标题】:What's the difference between OuterClass.this and new OuterClass() while referencing an outer class from an anonymous inner class?从匿名内部类引用外部类时,OuterClass.this 和 new OuterClass() 有什么区别?
【发布时间】:2017-12-01 14:08:24
【问题描述】:

实际上在 Android 中,使用 OnClick 侦听器对象使用 Intent 移动到不同的活动时,我使用了 sn-p

import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Set the content of the activity to use the activity_main.xml layout file
    setContentView(R.layout.activity_main);

    TextView numbers = findViewById(R.id.numbers);
    numbers.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            startActivity(new Intent(**MainActivity.this**, NumbersActivity.class));
        }
    });


}

}

但即使是下面的 sn-p 也能正常工作

import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Set the content of the activity to use the activity_main.xml layout file
    setContentView(R.layout.activity_main);

    TextView numbers = findViewById(R.id.numbers);
    numbers.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            startActivity(new Intent(**new MainActivity()**, NumbersActivity.class));
        }
    });


}

}

为了突出差异,我想在 ... 中标记差异。这是否意味着在尝试访问匿名内部类的外部类时,我们必须在内部类中使用 sn-p "OuterClass.this" 来访问它。但是当我在匿名内部类中使用“new OuterClass()”而不是“OuterClass.this”时,即使这样也会给出正确的结果。我想问一下这两种格式是否相同,或者它们是否有任何隐藏的差异。

【问题讨论】:

  • 你甚至无法比较这两种情况...java的基础operator newthis...显然Intent构造函数期望将任何上下文对象作为第一个参数
  • 但它们都给出相同的结果
  • 不,第二个不应该工作,因为你不应该在 android 平台上创建 Activity 派生类的实例...... 同样在第一种情况下,你将外部类实例作为参数传递,在第二种情况下你正在传递同一个类的新实例 ...在开始android编程之前你应该学习一些java的基础
  • 非常抱歉......它不起作用......我明白了......但两者都返回外部类的对象。不同之处在于一个正在创建一个全新的对象,而另一个正在引用当前的 Outer 类实例……如果我错了,请纠正我。

标签: java android this anonymous-inner-class


【解决方案1】:

这两个运算符没有可比性。

使用new MainActivity() 时,您正在内存中创建一个新对象,标识为MainActivity

Documentation for "new".

使用MainActivity.this 时,您指的是来自MainActivity 类的对象。它之所以有效,是因为您已经MainActivity 类中。您的编译器理解这一点,并且 MainActivity 引用它自己。 (如果我错了,请带我回去,我不确定整个文本块)。

Documentation for "this".

我建议您使用 first 用法。第二个很棘手,您不会理解它为什么不起作用,从而使您对 Java 和(在某种意义上)面向对象编程的理解感到困惑。

【讨论】:

  • 但实际上,两者都填补了 Outer 类实例的位置,不是吗?一个只是创建一个全新的对象,而另一个是引用并返回当前对象......如果我想错了,请告诉我?
  • 两者都在为 Outer 类的实例填充位置。关于我的建议的部分只是我的意见,因为安迪在另一个答案上我也不是专家。我建议您在 Android 上查看 Intent 上的指南,或者在进入此类案例之前简单地学习“普通”Java。
  • 先生,非常感谢您的建议...请您提供有关如何有效学习内部类、本地类、匿名类和其他嵌套概念的任何资源来帮助我...oracle文档似乎非常非常压倒性...非常感谢
  • 有很多。如有疑问,Oracle official documentation 总是有帮助的。如果你喜欢交互编码,Codecademy 有一些很好的教程,以辅助项目的形式。 Java Lessons 会从例子中教你(这是最好的方法之一),如果你准备好以后用 Java 尝试一些东西,我建议你尝试一些 Code katas。当然,如果有疑问,请先在 StackOverflow 上查看(良好的反应 :))。
  • 帮了大忙……非常感谢
【解决方案2】:
  1. new 创建一个新实例(对象),因此new MainActivity() 创建一个 MainActivity 的新实例。

  2. MainActivity.this 指的是已经存在的 MainActivity 实例。这种格式是必要的,因为您是从View.OnClickListener 的实例中访问它,而普通的this 将引用View.OnClickListener 的这个实例。

所以,我不太了解 Android,但我认为您想要做的是使用 MainActivity.this,因为它引用了 MainActivity 的现有对象。

【讨论】:

  • 这对我有很大帮助
  • @DeepRoy 那么我恳请您接受它作为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多