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中按钮按下的动作回调。