主类中使用的每个类都必须是静态的吗?

时间:2018-09-07 15:21:06

标签: java class error-handling static main

我对Java完全不了解,但是在实践的过程中,我发现使用OOP设计时,主类中的每个类都必须是静态的,对吗?在这段代码中,没有办法让我在main中调用不是静态的类(ShinyMetal)。似乎我可能遗漏了为什么将类声明为静态或不声明静态的地方。谢谢你的帮助!

public class Solution {

  public class ShinyMetal {

  }

  public static void main(String[] args) {
    ShinyMetal abcd = new ShinyMetal(); // error cannot be referenced from static context
    System.out.println(abcd.toString());
  }
}

3 个答案:

答案 0 :(得分:0)

  

主类中使用的每个类都必须是静态的吗?

否。

就您而言,问题不是ShinyMetal类不是静态的。问题在于您正在创建一个非静态内部类的实例,而没有外部类的实例。

您需要一个外部类的实例(如果此代码在外部类的实例上下文/方法中,则不需要此实例):

ShinyMetal abcd = new Solution().new ShinyMetal();

但是,如果您的内部类没有任何与外部类的链接,那么您可以简单地将ShinyMetal声明为静态嵌套类,这将使您当前的代码正常工作。

答案 1 :(得分:0)

由于您的类是一个非静态嵌套类,因此它包含一个引用及其父类(在这种情况下为Solution)。

因此,要实例化ShinyMetal,您需要一个父实例(即Solution)。

为了克服这一点,您需要将ShinyMetal声明为静态,或实例化Solution才能对其进行访问。

我建议您查看此处的文档,该文档很好地解释了所有这些内容:

https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html

答案 2 :(得分:0)

否,它不一定是static。这仅是因为您是从static方法内部调用的(在这种情况下为main,它实际上必须为static)。您可以先创建Solution类的实例,在这种情况下,ShinyMetal不必是静态的:

public class Solution {
  public class ShinyMetal {
  }

  public static void main(String[] args) {
    Solution solution = new Solution();
    ShinyMetal abcd = solution.new ShinyMetal(); // No longer gives an error
    System.out.println(abcd.toString());
  }
}

Try it online.

您还可以从非静态方法中调用它,但是您仍然需要Solution的实例才能调用该方法,

class Solution {
  class ShinyMetal {
  }

  public static void main(String[] args) {
    Solution solution = new Solution();
    solution.createAndPrintShinyMetal();
  }

  private void createAndPrintShinyMetal(){
    ShinyMetal abcd = new ShinyMetal();
    System.out.println(abcd.toString());
  }
}

Try it online.