在 Java 中存在一些内部类扩展外部类的情况。
例如,java.awt.geom.Arc2D.Float 是 java.awt.geom.Arc2D 的一个内部类,也扩展了 Arc2D。(参见http://download.oracle.com/javase/6/docs/api/java/awt/geom/Arc2D.Float.html)
此外,sun.org.mozilla.javascript.internal.FunctionNode.Jump 扩展了 sun.org.mozilla.javascript.internal.Node,它是 FunctionNode 的超类。(抱歉...找不到指向 javadoc 的链接)
对我来说,这似乎很奇怪。然后你能创造这些吗?
new Arc2D.Float.Float() //n.b. I couldn't get this to compile in Intellij IDEA;
new FunctionNode.Jump.Jump.Jump(1); // I could get this to compile
将子类嵌套为超类的内部类有什么作用?
我想知道是否要访问超类中的某些内容,但是如果您想访问父类中的任何变量/方法,可以使用
super.variable;
或者
super.method();
编辑 1:jjnguy 建议将逻辑保持在同一个地方。在这种情况下,你为什么不写一个文件 com.mypackage.AbstractTest:
abstract class AbstractTest {
abstract String getString();
}
class ExtensionTest extends AbstractTest {
@Override
String getString() {
return "hello world";
}
}
... 而不是:
abstract class AbstractTest {
abstract String getString();
class ExtensionTest extends AbstractTest {
@Override
String getString() {
return "hello world";
}
}
}
编辑 2:正确地指出,我之前编辑中的建议有缺陷,因为无法在包之外构造 ExtensionTest。但是,我在周末对此进行了进一步的思考,那么以下内容呢:
abstract class Test {
public class ExtensionTest extends AbstractTest {
@Override
String getString() {
return "hello world";
}
}
private abstract class AbstractTest {
abstract String getString();
}
}
本质上,到目前为止我看到的最好的答案是让内部类扩展其外部类允许将逻辑组合在一起。但是,我认为这可以在没有扩展的情况下完成。
在我看来,拥有一个可以嵌套无数相同子类的类似乎是糟糕的设计。(上下文:这是在尝试为代码完成实用程序生成字典时出现的,并抛出了 StackOverflowException。我找到了一种解决方法,但我无法理解为什么它是这样设计的。)