【问题标题】:Does every class used in main class have to be static? [duplicate]主类中使用的每个类都必须是静态的吗? [复制]
【发布时间】:2019-02-12 23:36:20
【问题描述】:

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

【问题讨论】:

  • 你还没有将一个类声明为静态的。
  • ShinyMetalSolutioninner 类,由于它不是静态的,因此您需要 Solution 的实例来调用构造函数(继续阅读内部类了解更多信息)。所以至少有 3 种方法可以解决这个问题: 1. 将 ShinyMetal 移出 Solution,将其移到自己的文件中或使其成为非公开文件,2. 将 ShinyMetal 设为静态,3. 通过 @ 创建实例987654328@.

标签: java class error-handling static main


【解决方案1】:

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

没有。

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

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

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

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

【讨论】:

    【解决方案2】:

    由于您的类是非静态嵌套类,它包含对其父类的引用(在本例中为 Solution)。

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

    为了克服这个问题,您需要将ShinyMetal 声明为静态或实例化Solution 以访问它。

    我建议你看看这里的文档,它很好地解释了所有这些:

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

    【讨论】:

      【解决方案3】:

      不,不一定是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.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-14
        • 1970-01-01
        • 2015-03-26
        • 2010-09-28
        • 1970-01-01
        • 2013-09-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多