在Java中,内部类扩展了外部类。
例如,java.awt.geom.Arc2D.Float是java.awt.geom.Arc2D的内部类,并且还扩展了Arc2D。(cf 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。我找到了一种解决方法,但我只是不明白为什么要这样设计。)
看看Java的Point2D
。它有两个内部类,它们是它的子类。
要注意的重要一点是它们是static
内部类。这与常规的内部类完全不同。就像静态方法一样,静态类是在类级别而不是对象级别定义的。
在这种Point2D
情况下,逻辑上耦合了类及其逻辑。它可以帮助该abstract
类型的用户Point2D
找到他们可以使用的实现。
针对您的修改,我想指出一个重要的事实。单个Java文件只能包含一个公共类,公共内部类除外。尽管您的两个示例都可以编译,但它们不允许公众访问这些类。如果要在单个文件中向某人展示多个公共类,则必须使用公共静态内部类。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句