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

时间:2014-06-24 12:18:44

标签: java inheritance inner-classes

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

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

5 个答案:

答案 0 :(得分:2)

如果我理解正确,你想从扩展内部类的类中访问外部类的成员。

您只能这样做,具体取决于您声明课程的范围。在外部类中扩展内部类时,所有成员都在范围内,您可以访问它们,如

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内部实例

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

非静态内部类具有指向包含类(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();
        }
    }
}

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

答案 3 :(得分:0)

内部类只是一个普通类,其隐藏字段包含对用于创建它的外部类实例的引用。

您已正确创建了一个子类来覆盖内部类,因此子类 Inner。内部对象"将没有其他"封闭的实例。你有this

要从Outer访问My,您必须将其保存到My中的其他字段,或者在Inner中创建一个方法以展示它,因为字段Outer.this指的是私有字段。

答案 4 :(得分:0)

我发现只有一个解决方案:

class Outer{
    class Inner{
        Outer outer = Outer.this;
    }
}

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