首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我们不能从内部类构造函数访问另一个内部类呢?

为什么我们不能从内部类构造函数访问另一个内部类呢?
EN

Stack Overflow用户
提问于 2014-11-15 08:14:28
回答 2查看 45关注 0票数 0
代码语言:javascript
复制
class Main
{
    public static void main (String[] args) throws java.lang.Exception
    {
    }

    public class SuperInner{
        int a;
    }

    public class Inner{
        public class MegaInner{
            public MegaInner(){
                Main.SuperInner.this.a = 6; //error: not an enclosing class: Main.SuperInner
            }
        }
    }
}

IDEON

JLS说的是:

设C是由ClassName表示的类。设n是整数,使得C是出现限定表达式的类的第n个词汇包围类。 ..。 如果当前类不是类C或C本身的内部类,则这是编译时错误。

在本例中,C:=Main是一组内部类S := {SuperInner, MegaInner, Inner}。这意味着上面的代码应该可以正常工作。怎么了?

EN

回答 2

Stack Overflow用户

发布于 2014-11-15 08:26:06

可以有多个SuperInner实例,以及InnerMegaInner的实例。从Main.SupperInner.this.a内部调用MegaInner时,不清楚哪个实例(如果有实例的话)应该将a变量设置为6。

内部类的行为与普通类非常相似:始终需要一个实例来设置它们中的变量。Main.SuperInner.this并不表示MegaInner视图中的实例,因为this仅指MegaInner的类层次结构,而SuperInner并不是该类层次结构的一部分。

票数 1
EN

Stack Overflow用户

发布于 2014-11-15 08:28:35

“限定此”表达式Main.SuperInner.this.a应用程序在MegaInner中。

MegaInner的封闭类是InnerMain。因此,this是第0合格的thisInner.this是第1合格的,Main.this是第2的。

您缺少的部分是,它必须是,一个包含类的类,其中出现了带有this的表达式。SuperInner不是MegaInner的封闭类,因此Qualified this不适用于它。

在现实中好好想想。this表达式引用类的一个实例。它并不是指类本身。例如,不能从静态方法引用this

现在,当您创建MegaInner实例时,它必须是Inner的实际实例和Main的实际实例的一部分。但是不能保证有一个SuperInner的实际实例。封闭类的代码可以在任何时候创建SuperInner类型的对象,并且独立于Inner实例。

因此,您不能在编译时访问它的this。但是,如果通过引用变量向您提供它的实例,则允许您访问变量a,因为它们都是同一个外部类的成员。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26943958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档