从匿名内部 class 引用外部 class 时,OuterClass.this 和 new OuterClass() 有什么区别?

What's the difference between OuterClass.this and new OuterClass() while referencing an outer class from an anonymous inner class?

实际上在 Android 中,当使用意图移动到另一个 activity 使用 OnClick Listener 对象时,我使用了片段

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));
        }
    });


}

}

但即使是下面的代码片段也能正常工作

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));
        }
    });


}

}

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

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

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

Documentation for "new".

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

Documentation for "this".

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

  1. new 创建了一个新的实例(对象),所以 new MainActivity() 创建了一个 MainActivity[=29= 的新实例].

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

  3. 的实例

所以,我不太了解 Android,但我认为你想要做的是使用 MainActivity.this,因为它引用了 的已经存在的对象MainActivity.