为什么我需要提供封闭的类对象而不是封闭的类对象

pai*_*dly 9 java inheritance inner-classes

class OuterA {
    class InnerA {
    }
}
class SubclassC extends OuterA.InnerA { 
    SubclassC(OuterA outerRef) {
        outerRef.super(); 
    }
}
class XYZ {
    public static void main(String[] args) {
        new SubclassC(new OuterA());
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中

  1. 为什么我需要将OuterA对象引用传递给SubclassC.java文件的构造函数进行编译?
  2. 为什么InnerA不需要将对象引用传递给SubclassC构造函数?

Kon*_*kov 6

为什么我需要将OuterA对象引用传递给.cava文件的SubclassC构造函数进行编译?

因为SubclassC 扩展InnerA类的定义.同时,InnerA类被绑定OuterA(即,所有的实例InnerA将被绑定到的相应的实例OuterA).因此,要获取实例SubclassC,需要一个实例OuterA.

为什么不需要将InnerA对象引用传递给SubclassC构造函数?

因为在创建一个SubclassC引擎盖时,首先会创建一个超类的实例,即会有一个实例InnerA.你实际上可以SubclassC看作是一种特殊InnerA.


adr*_*der 2

1.Why do I need to pass OuterA object reference to SubclassC constructor for the .java file to compile? 
Run Code Online (Sandbox Code Playgroud)

因为您需要知道类实例的名称才能调用该函数,因为SubclassC扩展了类OuterA.InnerASubclassC extends OuterA.InnerA {

SubclassC(OuterA outerRef) {
        outerRef.super(); 
Run Code Online (Sandbox Code Playgroud)

第二名

2. Why is InnerA object reference not required to be passed to SubclassC constructor?
Run Code Online (Sandbox Code Playgroud)

因为 Innera 位于 Outtera 内部,您在创建对象时调用它 new SubclassC(new OuterA());(即您不需要创建单独的对象,因为InnerAis inside OuterA。在这种情况下创建就OuterA足够了