在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,而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。我找到了一个解决方法,但我只是无法理解为什么要以这种方式进行设计。)
javac
会愉快地编译这一行代码:Object obj3 = new java.awt.geom.Arc2D.Float.Float.Float();
。 - 101100