Java:使用继承对外部类的引用数

Java:使用继承对外部类的引用数,java,inheritance,nested,Java,Inheritance,Nested,每个非静态嵌套类都保留对其外部类的引用,以便访问外部类的方法和字段 考虑到这门课 class Parent { // some fields // some methods protected class NestedParent { // some other fields // some other methods } } 。。。这门课: class Child extends Parent { // some

每个非静态嵌套类都保留对其外部类的引用,以便访问外部类的方法和字段

考虑到这门课

class Parent
{
    // some fields
    // some methods
    protected class NestedParent
    {
        // some other fields
        // some other methods
    }
}
。。。这门课:

class Child extends Parent
{
    // some fields
    // some methods
    protected class NestedChild extends NestedParent
    {
        // some other fields
        // some other methods
    }
}
NestedParent类具有对其外部类父类的引用;因为NestedChild继承自NestedParent,所以它也将具有该引用。但是,NestedChild是否也会单独引用Child,还是会使用继承的引用并将其强制转换为Child以访问Child的成员


我问这个问题是因为我想知道NestedChild的最终尺寸。如果它有一个额外的4字节的引用,这在我正在处理的项目中是一个很大的内存浪费,因为NestedChild将有数百万个实例。

您的理解有点错误,因为每个子类实例的类型都是父类,因此子类实例是NestedChild的外部封闭类

NestedChild类将只引用子实例,因此这里没有内存问题。Java通过引用而不是实际对象工作,不像C(没有指针的概念,只有引用)。子实例持有对父类成员的引用(参见对象图)。 对象引用是对象堆的一部分,类定义位于方法区域

为清晰起见进行了编辑:-


试着从Child注释出“extends Parent”,您会看到编译器抱怨NestedChild内部类不存在Parent类型的封闭对象。

您真的需要先使用内部类吗?我个人会尝试设计更简单的类型。。。例如,您总是可以使用对父类的显式引用使它们成为嵌套的静态类。考虑到这里混合了继承和多重嵌套,我一定会尽量简化。@JonSkeet它不必像这样专门设计,不,但是内部类对于封装我所需要的内部实现非常有用。我有几个设计草稿,我正在尝试评估这一个,我很好奇Java做了什么。谢谢。或者,您是否有关于此主题的一些源代码或参考资料可以进一步向我介绍?尝试从Child中注释“extends Parent”,您会看到编译器抱怨不存在Parent类型的封闭对象