【发布时间】:2023-03-27 21:01:01
【问题描述】:
这两个内部类声明有什么区别?也评论一下优点/缺点?
案例 A:类中的类。
public class Levels {
static public class Items {
public String value;
public String path;
public String getValue() {
return value;}
}
}
和案例 B:接口内的类。
public interface Levels{
public class Items {
public String value;
public String path;
public String getValue() {
return value;}
}
}
更正:getvalue 方法的位置。
更多信息: 我可以在另一个完全不实现接口的类中实例化 A 和 B 的 Items 类。
public class Z{//NOTE: NO INTERFACE IMPLEMENTED here!!!!
Levels.Items items = new Levels.Items();
}
由于没有实例化接口,因此接口内的所有元素都可以通过点表示法访问,而无需实例化 LEVELS 接口,这仅仅是因为您无法实例化接口 - 有效地使接口内定义的类对静态引用具有渗透性。
所以说如果 B 不是静态的 Items 类是没有意义的。由于案例 A 和 B 都以相同的方式实例化,因此我不是在寻找关于静态、内部或嵌套的语义。别再给我关于语义的答案了。我想要编译器、运行时和行为差异/优势,或者如果没有,那么就这么说。请不要再有关于语义的答案!!!!!!请一位 JVM 或 .NET VM 规范内部专家回答这个问题,而不是教科书语义学家。
【问题讨论】:
-
我不是在寻找它是称为内部类还是嵌套类的语义。我正在寻找功能差异。
-
@h2g2 - 仅重新格式化代码后 - 您的第二个示例不正确,您不能在接口中实现方法。或者也许大括号不在正确的位置......
-
对于您显示的接口定义,我得到一个编译错误(JDK/5 和 6)“接口方法不能有主体”。您是复制/粘贴编译的代码还是只是键入它?
-
就个人而言,我根本不喜欢公共内部类。如果它们只被一个类使用,我将它们设为私有,如果它们被多个类使用,它们应该有自己的命名空间。我也永远不会在接口中创建内部类。我不希望/期望它像那样工作,但从来没有费心去测试。
标签: java nested-class inner-classes static-class