假设我有一个A类和一个内部A.B类,并且在单独的类的方法中创建了一个A.B类的实例。

A obj1 = new A();
A.B obj2 = obj1.new B();


这是什么情况?它是obj1的一部分还是独立的对象?

据我了解,有一些实例是独立实体,例如1个苹果,1个人等。是否可以与内部类的对象进行类比?

最佳答案

B objectOfB1 = objectOfA1.new B();

B objectOfB2 = objectOfA2.new B();

暗示objectOfB1与objectOfA相关联。 objectOfB1具有由objectOfA1引用的对象的隐式引用。类似地,objectOfB2与objectOfA2相关联。

现在,即使objectOfA1 = null;完成后,A所引用的A对象也将不符合垃圾回收的条件,因为它从B类的对象内部进行了硬引用,即。 objectOfB1。

objectOfB1知道objectOfA1,反之亦然。您可以认为这就像我们将objectOfA1作为构造函数参数传递来创建objectOfB1一样。对于objectOfB2也是一样,它包含对objectOfA2的隐式引用。

class OuterClass{
    InnerClass dataMem1;
    InnerClass dataMem2;

    class InnerClass{
        int k;
    }

}


这里,没有OuterClass的对象就不能存在InnerClass的对象,因此在编译时,外部编译器的引用将由It编译器注入。

并非完全按以下方式发生,但是您可以参考以下代码来理解,因为遵循上述代码时会发生非常相似的事情。

class OuterClass{
    InnerClass dataMem1;
    InnerClass dataMem2;
}


class InnerClass{
    OuterClass objInjectedByCompiler;
    int k;
    // constructor
    InnerClass(OuterClass objectOfOuter){
        this.objInjectedByCompiler = objectOfOuter;
    }
}


为了创建InnerClass对象,您需要一个OuterClass对象。

现在的问题应该是InnerClass的对象实际上如何获得OuterClass的对象。当我们执行objOfOuter.new InnerClass()时,与this关联的objOfOuter充当OuterClass类的所需对象。

PS:以上内容适用于非静态嵌套类,而不适用于静态的内部嵌套类。

10-04 14:10