【问题标题】:If a method returns an anonymous class, is it returning a subclass or an inner class?如果一个方法返回一个匿名类,它是返回一个子类还是一个内部类?
【发布时间】:2019-09-11 22:02:27
【问题描述】:

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

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) {
            }
        };
    }
}

Post 1

Post 2

根据帖子 1,代码似乎返回了一个匿名内部类。但这不违反内部类的原则,因为它们只与它们所在的父类相关(根据帖子 2)?帖子 1 中接受的答案说内部类也是父类的子类。如果这是真的,那么返回这个内部/子类是有意义的。但根据 Post 2,内部类不是子类。那么我该怎么做呢?这个方法是返回内部类还是子类的实例?

【问题讨论】:

  • 内部类和子类是不同的概念,但它们并不相互排斥。一个类可以是一个内部类一个子类。
  • 我明白了。我刚找到this post,同意你的观点。
  • 内部类上下文中的“父类”通常称为“封闭类”,父类保留用于继承(子类)。
  • @k5_ 已注明。谢谢指正。

标签: java


【解决方案1】:

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

    return new BaseInitializable() {
        ...
    };

这取决于BaseInitializable 是什么。如果它是一个,那么匿名类是BaseInitializable 的子类。如果是接口,那么匿名类是Object的子类,它实现了BaseInitializable

另外,请记住匿名类的定义是内部类。所以说JLS 15.9.5. Anonymous Class Declarations

匿名类始终是内部类。

这意味着,回答你的问题:

此方法是返回内部类还是子类的实例?

两者兼而有之。匿名类是一个内部类一个子类(BaseInitializableObject)。

或者,如果您不认为以 Object 作为超类的类是子类:
这取决于。匿名类是一个内部类。如果它实现了一个,它也是一个子类,而不是一个接口

【讨论】:

    【解决方案2】:

    这种说法“[内部类]只与它们所在的父类相关”是完全错误的。

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

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

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

    在这种情况下,内部类不是外部类的子类。我认为这就是帖子 2 所说的。

    【讨论】:

    • 但是内部类(相对于子类)的目的不是将代码逻辑分组到一个使用它的地方吗?至少,这就是我从this post 得到的。但是谢谢,我现在明白内部类虽然不同,但也可以是子类。
    • 将代码分组在一个地方可能是一个目的,但我发现更多时候目的与访问有关。例如。一个典型的用途是为监听器创建一个匿名类,因为在监听器实现中需要调用外部类的各种方法。但是,您不想直接在外部类中实现接口,可能是因为您需要多个相同接口的实现。一个很好的例子是在 GUI 中按下按钮的动作回调。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 2016-01-21
    • 1970-01-01
    相关资源
    最近更新 更多