Java 如果一个方法返回一个匿名类,它是返回一个子类还是一个内部类?

Java 如果一个方法返回一个匿名类,它是返回一个子类还是一个内部类?,java,Java,也许没什么区别,但我还是想知道。我想知道返回匿名类意味着什么,如下所示: public class Module extends BaseModule { private BaseInitializable initializeModule() { return new BaseInitializable() { public void initialize(InitializationContext context) {

也许没什么区别,但我还是想知道。我想知道返回匿名类意味着什么,如下所示:

public class Module extends BaseModule {

    private BaseInitializable initializeModule() {
        return new BaseInitializable() {
            public void initialize(InitializationContext context) {
                helperA.initialize();
                helperB.initialize();
                s_logger.log(LogLevel.INFO,"something");
            }

            public void shutdown(InitializationContext context) {
            }
        };
    }
}

根据Post1,代码似乎返回了一个匿名的内部类。但这是否违背了内部类的原则,因为它们只与它们所在的父类相关(根据文章2)?帖子1中的公认答案是,内部类也是父类的子类。如果这是真的,那么返回这个内部/子类是有意义的。但根据Post2,内部类不是子类。那么我该如何看待这件事呢?此方法是否返回内部类或子类的实例?

此语句“[内部类]仅与它们所在的父类相关”完全错误

内部类有一个对外部类的隐藏引用,并且它有权访问外部类的私有成员。这就是它的特殊之处

您问题中的方法确实返回了从BaseInitializable派生或实现BaseInitializable的匿名内部类的实例(这是接口还是类?)

注意,如果BaseInitializable是一个类,那么这个匿名内部类也是BaseInitializable的一个子类。如果BaseInitializable是一个接口,那么从技术上讲它不是一个子类

在本例中,内部类不是外部类的子类。我想这就是第二篇文章所说的

我想知道返回匿名类意味着什么,如下所示:

public class Module extends BaseModule {

    private BaseInitializable initializeModule() {
        return new BaseInitializable() {
            public void initialize(InitializationContext context) {
                helperA.initialize();
                helperB.initialize();
                s_logger.log(LogLevel.INFO,"something");
            }

            public void shutdown(InitializationContext context) {
            }
        };
    }
}
这取决于
BaseInitializable
是什么。如果是类,则匿名类是
BaseInitializable
的子类。如果它是一个接口,那么匿名类是
Object
的子类,它实现
BaseInitializable

另外,请记住,根据定义,匿名类是内部类。JLS如是说:

匿名类始终是内部类

也就是说,回答你的问题:

此方法是否返回内部类或子类的实例

两者都有。匿名类是一个内部类和一个子类(属于
BaseInitializable
Object

或,如果不考虑类<代码>对象< /代码>作为它们的超类为子类:


视情况而定。匿名类是一个内部类。如果它实现一个类而不是一个接口,那么它也是一个子类。

内部类和子类是一个不同的概念,但它们并不相互排斥。一个类可以是一个内部类和一个子类。我刚刚发现这一点与您的看法一致。内部类上下文中的“父类”通常被称为“封闭类”,父类是为继承(子类)保留的。感谢您的更正。但是内部类(相对于子类)的目的不是将代码逻辑地分组到使用它的地方吗?至少,这是我从中得到的。但是谢谢,我现在明白了内部类虽然不同,但也可以是子类。将代码分组到一个地方可能是一个目的,但我发现更多的时候,目的与访问有关。例如,一个典型的用法是为侦听器创建一个匿名类,因为您需要在侦听器实现中调用外部类的各种方法。但是,您不希望直接在外部类中实现接口,可能是因为您需要同一接口的多个实现。一个很好的例子是GUI中按钮按下的动作回调。