我尝试运行我的
MainClass.java
文件中包含的以下代码,但由于编译错误而失败。
public class MainClass
{
public static interface StaticParentType{
public static class StaticChildType implements StaticParentType {}
}
public static void main(final String[] args)
{
new StaticChildType();
}
}
因以下编译错误而失败。
$ java MainClass.java
MainClass.java:10: error: cannot find symbol
new StaticChildType();
^
symbol: class StaticChildType
location: class MainClass
1 error
error: compilation failed
我尝试了各种不同的公共/私有、静态/非静态组合,看来让我的代码正常工作的唯一方法是改为执行以下操作。
public class MainClass
{
public static interface StaticParentType{}
public static class StaticChildType implements StaticParentType {}
public static void main(final String[] args)
{
new StaticChildType();
}
}
所以,我没有被阻止,我在这里有足够好的解决方法。似乎将类包含在花括号中会阻止
main
方法能够看到和/或使用它。
我的问题是为什么?更具体地说,为什么
public static
内部类对 main 方法不可见?我真的觉得公开和静态(以及公开和静态的界面)会使它可见,但它似乎不是。我花了几分钟搜索 StackOverflow 和互联网,但似乎没有出现。
有趣的是,在为这个问题添加标签时,
inner-classes
和 static-classes
的资源为我指明了正确的方向。
对于初学者来说,我找不到答案的部分原因是因为我使用了错误的术语。事实证明,它的官方词是
static nested class
,你可以在这里看到(Ctrl+F“术语”)——https://docs.oracle.com/javase/tutorial/ java/javaOO/nested.html
事实证明,如果你想在嵌套它的类之外使用静态嵌套类,你必须像这样引用静态嵌套类。
StaticParentType.StaticChildType
请注意,此语法仅适用于我的嵌套类是
static
。如果那不是真的,规则就会改变。单击前面提到的链接以了解更多信息。
因此,就我的目的而言,这意味着我的主要方法必须如下所示。
public static void main(final String[] args)
{
new StaticParentType.StaticChildType();
}
这是完整的课程。
public class MainClass
{
public static interface StaticParentType{
public static class StaticChildType implements StaticParentType {}
}
public static void main(final String[] args)
{
new StaticParentType.StaticChildType();
}
}
作为奖励,我走得更远,将访问修饰符设置为它们应该的样子。我最初希望嵌套类和包含它的类都是私有的,但是一旦出现编译错误就改变了它。这是我找到的最终解决方案。
public class MainClass
{
private interface StaticParentType{
static class StaticChildType implements StaticParentType {}
//apparently, this nested static class cannot be private
//else it gets a compilation error
}
public static void main(final String[] args)
{
new StaticParentType.StaticChildType();
}
}