Java 什么';从匿名内部类引用外部类时,OuterClass.this和new OuterClass()之间的区别是什么?

Java 什么';从匿名内部类引用外部类时,OuterClass.this和new OuterClass()之间的区别是什么?,java,android,this,anonymous-inner-class,Java,Android,This,Anonymous Inner Class,实际上,在Android中,当使用意图移动到使用OnClick Listener对象的不同活动时,我使用了代码段 import android.widget.TextView; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

实际上,在Android中,当使用意图移动到使用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));
        }
    });


}

}

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

这两种运算符是不可比较的

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

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

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

  • 新建创建一个新实例(对象),因此
    newmainActivity()
    创建一个MainActivity的新实例

  • MainActivity。此
    引用已存在的MainActivity实例。此格式是必需的,因为您是从
    View.OnClickListener
    实例中访问它的,其中普通
    This
    将引用
    View.OnClickListener
    的此实例


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

    你甚至无法比较这两种情况。。。java的基础
    操作符新增
    。。。显然
    Intent
    constructor希望获得任何上下文对象作为第一个参数,但它们都给出相同的结果。第二个不应该工作,因为您不应该在android平台上创建Activity derrived类的实例。。。同样,在第一种情况下,您将外部类实例作为参数传递,在第二种情况下,您将传递同一类的新实例。。。在开始android编程之前,你应该先学习一些java的基础知识非常抱歉…它不起作用…我知道了…但两者都返回了外部类的对象。区别在于,一个正在创建一个全新的对象,而另一个正在引用当前的外部类实例…如果我错了,请纠正我。但实际上,两者都在填充外部类实例的位置,不是吗?一个只是创建一个全新的对象,另一个是引用并返回当前对象…请告诉我我是否想错了?两者都在填充外部类实例的位置。我的建议只是我的意见,因为安迪在另一个答案上我也不是专家。我建议您查看Android上的
    Intent
    指南,或者在进入此类案例之前简单地学习“普通”Java。先生,我感谢您的建议…您能帮我推荐一些关于如何有效学习内部类、本地类、,匿名类和其他嵌套的概念…oracle文档似乎非常强大…非常感谢这里有很多。当有疑问时,答案总是有用的。如果您喜欢交互编码,则可以通过辅助项目的形式提供一些不错的教程。我将从示例中教您(这是最好的方法之一),如果您以后准备用Java进行尝试,我建议您尝试一些。当然,当有疑问时,请首先检查这里的StackOverflow(良好的反射:)。这是一个很大的帮助…我非常感谢它对我的帮助me@DeepRoy那么我恳请你接受这个答案。