我的静态方法找不到我的静态内部类'静态内部类

问题描述 投票:0回答:1

我尝试运行我的

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 和互联网,但似乎没有出现。

java static-methods inner-classes static-classes
1个回答
0
投票

有趣的是,在为这个问题添加标签时,

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();
   }

}
© www.soinside.com 2019 - 2024. All rights reserved.