为什么我不能从内部类的非静态方法中引用封闭类的非静态var?

时间:2015-06-12 17:55:59

标签: java static nested this

在我的意识中,非静态方法将为其类obj&分配“this”变量。所有封闭的课程。

public class TestNested {

int a=4;

public static class a{

    int a=5;

    static int c=10;

    class b{

        int a=6;

        void aaa(){

            int a=7;

            TestNested t=new TestNested();

            System.out.println(this.a);

            System.out.println(b.this.a);

            System.out.println(TestNested.a.b.this.a);

            System.out.println(TestNested.a.this.a);

            System.out.println(a.this.a);

            System.out.println(t.a);

            System.out.println(TestNested.this.a);

        }
    }
}

void r(){

    TestNested t=new TestNested();

    TestNested.a a=new TestNested.a();

    a.b b=a.new b();

    b.aaa();
}

public static void main(String[] args) {

    TestNested t=new TestNested();

    t.r();
}
}

在这种情况下,void aaa()的最终语句System.out.println(TestNested.this.a);将被判为导致编译错误,原因是:'com.xxx.TestNested.this'无法从静态上下文中引用,这真让我感到困惑,因为指向this的{​​{1}} var应该是方法本身的非静态隐藏var,那么为什么它不能使用自己的var?< / p>

或者,如果我的意识错误,则在方法类的每个类中分配了每个TestNested var,但that不是静态方法,这意味着它可以引用非静态var仪式?或者甚至该方法不是静态的,但如果它的一个封闭类是静态的,它会被自动识别为静态成员吗​​?

2 个答案:

答案 0 :(得分:4)

这是因为您的嵌套类a TestNested的内部类。它是一个 static 嵌套类,这意味着它没有链接到TestNested的特定实例。

  

注意:内部类是非静态嵌套类。

您期望表达式TestNested引用TestNested.this的哪个实例?

顺便说一句,您可以在此处看到您未引用变量t

TestNested.a a=new TestNested.a();

指出对象a根本没有链接到t

在上面的回答中,我认为你对this所做的事情很清楚。根据你的评论,似乎并非如此,所以我将在这里尝试澄清它。

首先,this总是引用一个对象:一个类的实例。

我们假设我们在类b中的非静态方法的上下文中。因为该方法是非静态的,所以代码将相对于b的特定实例执行。我使用快捷方式将此特定实例称为&#34; b的实例在&#34;。

由于ba的内部类,因此在b的实例之外不能存在a的实例。这意味着您所在的b实例包含在a的实例中。我使用快捷方式将此特定实例称为&#34; a的实例在&#34; (从技术上讲,您位于b中的a

因此,在b的非静态方法的上下文中:

  • this指的是您所在的b的实例。这是此关键字的标准用途。
  • b.thisa.b.thisTestNested.a.b.this与此处的this相同,不同之处仅在于您更准确地限定了类b
  • a.thisTestNested.a.this都引用了您a的实例(TestNested.a只是a的更精确的限定条件) 。存在此a对象是因为ba的内部类,这意味着b的每个实例都链接到a的实例。这是引用a
  • 实例的唯一方法
  • TestNested.this会引用您TestNested的实例。但您不在TestNested 的任何实例中,所以它没有任何意义,因此编译错误。您位于b的实例中,该实例位于a的实例中(因为ba的内部类)。 a的实例本身就存在,因为aTestNested的静态嵌套类,因此它未链接到TestNested的实例。

答案 1 :(得分:0)

TestNested.a&lt; - 引用静态类的静态变量

this.a&lt; - 引用对象的实例变量

TestNested.this&lt; - 尝试从静态上下文引用一个对象,但是&#34;这个&#34;在静态上下文中不存在。

您可以引用非静态内容,但反之亦然。