静态嵌套类可以通过非静态扩展

时间:2017-12-13 20:35:57

标签: java inheritance inner-classes

我的代码如下: -

课程T可以展开ClassO.FourFourClassO内的静态类,但无法扩展ClassO.Two TwoClassO内的内部类。我收到错误

No enclosing instance of type ClassO is available due to some intermediate constructor invocation

行为不同的原因是什么?

class ClassO
{   
    interface inner
    {
        void msg();
    }

    class Two implements inner
    {
        public void msg()
        {
            System.out.println("Class Two");
        }
    }

    static class Four 
    {
        public  void msg()
        {
            System.out.println("Class Four");
        }
    }

    public void m()
    {

    }
}

class T extends ClassO.Two  **// can extend ClassO.Four but not ClassO.Three**
{
    public void msg()
    {
        System.out.println("Class Two");
    }
}

1 个答案:

答案 0 :(得分:0)

回想一下,静态内部类是一个“普通”类,其名称嵌套在其所有者类中,并且对其所有者类的私有静态成员具有其他访问权限。因此,静态内部类对它们可以实例化的位置没有限制。

相反,非静态内部类可以访问其所有者类的静态和非静态成员。为了实现这一点,Java编译器将一个隐藏指针嵌入到嵌套类中,并将所有者的实例传递给该构造函数。

此行为依赖于非静态内部类实例化时所有者this的可用性。如果编译器允许您从其所有者之外的非静态成员继承,则它将无法实例化派生类,实际上强制它的行为就好像它是一个内部类。这就是编译器禁止这种继承的原因。