从外类和其他内部类别对内部类进行子类化

sal*_*sal 7 java inheritance inner-classes

我很困惑为什么这是允许的

public class Foo {
    class Bar extends Foo {
    }
}
Run Code Online (Sandbox Code Playgroud)

但这是不允许的

public class Foo {
    class Bar extends Foo {
    }

    class Fooey extends Bar {
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器通知它在调用超类型构造函数之前无法引用Fooey.this.

这是允许的

public class Foo {
    static class Bar extends Foo {
    }

    class Fooey extends Bar {
    }
}
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?我在哪里可以找到有关内部类继承如何工作的更多信息?

编辑我遇到了两个相当糟糕的想法; 内部类扩展外部类,内部类扩展其他静态内部类.我不确定到底发生了什么以及我应该如何重构这一点.我最终只是将内部类拉出来并将它们封装在外部类中.

Tom*_*ine 6

首先:不要做这种事情.这是邪恶的.实际上,Java 1.1应该被更严格地指定,IMO.

关于thisFoo.Fooey构造函数中使用哪些内容存在困惑.外部this(Foo.this)可以工作.但实际this是a Foo但它不能传递给超级this构造函数,因为在超级构造函数返回之前使用的规则(除了有一个外部实例与内部实例相同的实例被填满).((Bar)this).this$0由于使用限制,超级" "(IIRC)上的外部也是无法访问的this.

解决方案是明确的.明确在我的书中通常是一件好事(除非它成为样板).

public class Foo {
    class Bar extends Foo {

    }

    class Fooey extends Bar {
        Fooey() {
            Foo.this.super();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

更好的是,没有内部类扩展自己的外部类,或扩展任何内部类.