当前位置: 首页 > 知识库问答 >
问题:

从内部类继承。从对内部类的引用访问封闭实体

巫马善
2023-03-14

我知道如果我想扩展内部类,我应该这样做:

class Outer{
    class Inner{}
}

class My extends Outer.Inner{
    My(Outer outer){
        outer.super();
    }
}

但是在这种情况下,我不明白该怎么办?如何获取内部对象的封闭实例

class My extends Outer.Inner{
    My(Inner inner){
        // how to get enclosing instance of inner here
    }
}

此变体不编译:

class Outer{
    class Inner{}
}

class My extends Outer.Inner{
    My(Outer.Inner inner){
        inner.Outer.this.super();
    }
}

共有3个答案

丁高峯
2023-03-14

非静态内部类有一个指向包含类的隐式指针(Outer.this)。所以不能在外部类之外创建它。但以下方法很好:

class Outer{
    class Inner{}

    class My extends Inner{
        My(Inner inner){
            //You cannot access Outer.this outside the object itself
            //inner.Outer.this.super();
        }
    }
}

如果内部类声明为静态,则它没有隐式指针,并且上述限制不再适用。

习胤运
2023-03-14

我相信如果您使内部类静态,这是有效的。

这样,即使没有外部类,也可以创建内部类的实例。

公羊学义
2023-03-14

如果我理解正确,您希望从扩展内部类的类访问外部类的成员。

您只能根据声明类的范围来执行此操作。当您在外类中扩展内部类时,所有成员都在范围内,您可以访问它们,类似于

class Outer {
    private int var = 0;

    class Inner {}

    class My extends Outer.Inner {
        My() {
            var = 1;
        }
    }
}

如果在外类之外声明类,如果扩展类型在同一个包中,您仍然可以访问包私有成员

class Outer {
    int var = 0;

    class Inner {}

}

class My extends Outer.Inner {
    My( Outer outer ) {
        outer.super();
        outer.var = 1;
    }
}

如果您在包范围之外,您可以通过将继承内部类的类封闭在继承外部类的类中来解决这个问题,以访问其受保护的成员:

class Outer {
    protected int var = 0;

    class Inner {}

}
class OuterMy extends Outer {
    class My extends Inner {
        My( Outer outer ) {
            var = 1;
        }
    }
}

如果这也不是一个选项,那么您只能通过手动存储外部实例来访问公共成员。

class Outer {
    public int var = 0;

    class Inner {}
}

class My extends Outer.Inner {
    private Outer outer;
    My( Outer outer ) {
        outer.super();
        this.outer = outer;
    }
    void method() {
        outer.var = 1;
    }
}

据我所知,这些是您的选项,您无法访问封闭类的JVM内部实例

 类似资料:
  • 我认为内部类的成员,即使被声明为私有的,也可以从它的封闭类中访问。但是我遇到了以下代码结构的编译时错误。我的顶级类实现了Iterable接口。Iterator在内部类中实现。当内部类的一个实例通过iterator()方法获得时,我无法使用该实例访问数据栏。 有什么建议吗?

  • 下面是我发现的关于内部类的两个语句 JavaDocs: 与实例方法和变量一样,内部类与其封闭类的实例相关联,并可以直接访问该对象的方法和字段。此外,因为内部类与实例相关联,所以它本身不能定义任何静态成员。 在另一个网站上,我发现了这个: 在大多数情况下,嵌套类就是在封闭类的定义中声明的类。它不会从封闭类继承任何东西,嵌套类的实例不能分配给封闭类的变量引用。 粗体标记的线条不矛盾吗?如何才能不继承周

  • 问题内容: 我正在扩展ArrayList来创建一个自定义ArrayList,可以在迭代它的同时使用常规ArrayList方法进行修改。为此,我还要创建一个迭代器。 在我的hasNext()和next()方法期间,我需要确保列表没有被修改(可以在任何其他时间修改)。因此,我需要在我的shared()块中引用我的封闭类型。 问题答案: 。因此,在您的情况下,它将为。

  • 问题内容: 如何从匿名类的方法内部访问? 问题答案: 如何从匿名类的方法内部访问? 您只需要访问它们即可: 更重要的是:为什么这对您不起作用?

  • (我一直在重读那个问题标题,思考它看起来有多荒谬,但我向你保证,这是对问题的最佳描述,我有一个实际的应用程序,其中这是最好的结构。我发誓我没有疯。) 考虑以下内容。每个块都是一个单独的文件: 注意,enclosinstance业务是为了解决涉及中间构造函数调用的问题。请参阅“为什么外部类不能扩展内部类?”。 我希望输出为“2”。但是相反,我在System.out.println(a.this.I)

  • 问题内容: 如何从内部类访问外部类? 我正在重写一种使它在不同线程上运行的方法。从内联线程中,我需要调用原始方法,但是当然只要调用就会变成无限递归。 具体来说,我在扩展BufferedReader: 这个地方给了我我找不到的NullPointerException。 谢谢。 问题答案: 像这样: 上面的测试在执行时显示: