【问题标题】:Using classes in static main method [duplicate]在静态主方法中使用类[重复]
【发布时间】:2016-07-03 04:47:39
【问题描述】:

所以我正在用 Java 编写一个迷你棋盘游戏程序。

程序将读取标准输入并按照输入的指示构建游戏。

为了帮助保持井井有条并提高我的 oo java 技能,我正在使用 Cell 类作为 nxn 游戏中的单元。

对于棋盘游戏,我需要将所有内容放在一个文件中,并且必须从 static void main 运行。

这是我的 Cell 类的样子

public class Cell{
      public int x;
      public int y;
      .
      .
      .
 }

我想读取输入,并为每个单元格赋值,然后将单元格添加到一个列表中,例如 ArrayList allCells。但是,我不能在静态上下文中使用它。

我知道静态是一个单一的实例,所以我很困惑我将如何去做。无论如何我可以使用基于类的系统来解决这个问题。每个单元格都是它自己的单个对象,因此使其成为 stat 不起作用。

任何形式的解释或替代方案都会令人惊叹!希望我的描述足够清楚。

【问题讨论】:

  • 实例化Cell类会有什么问题吗,例如Cell cell = new Cell(3, 0); ?
  • main 方法只是为了给你的程序一个入口点,通常是创建一个主要的主类对象,也许还有一些附属对象,然后设置它们。不要专注于主要方法。首先关注项目的“名词”。是的,Cell 课程很棒,但你打算把它放在什么地方?也许是一个 Grid 类,什么对象将运行程序的逻辑?以及哪些对象将与用户交互......
  • @TimBiegeleisen 我对你的问题有点困惑。在解析输入时,我尝试将每条信息放在这样的单元格中,但它不能,因为它是从静态上下文中调用的
  • "For the board game, I need to have it all in one file." -- 为什么?这个要求的理由是什么?
  • @HovercraftFullOfEels 我有一个 Game 类,类似于您所描述的 Grid 类,它是静态的。唯一的问题是有很多信息要放入其中。 Cell 类用于将每个单元的信息组织在一起。我不想忽略 main 方法,因为如果我让它发挥作用并且不能让它与 main 一起工作,那么它就没有意义了。

标签: java static main


【解决方案1】:

最好的方法是让Cell 在它自己的文件中成为一个顶级类,但是你已经表明你需要在一个文件中的所有东西。所以我会考虑到这个限制来回答。

您需要将Cell 类本身声明为static 才能在静态上下文中使用它。例如:

public class Game {
    public static class Cell { // doesn't really need to be public
        ...
    }

    public static void main(String[] args) {
        Cell c1 = new Cell();
        Cell c2 = new Cell();
        ...
    }
}

如果没有Cell 类的static 修饰符,当在main() 中调用new Cell() 时会出现编译器错误(我猜这基本上是你遇到的问题)。

另一种方法是将Cell 类修改为非public。然后你可以让它成为你的游戏类在同一个文件中的顶级类:

public class Game {
    public static void main(String[] args) {
        Cell c1 = new Cell();
        Cell c2 = new Cell();
        ...
    }
}

class Cell {
    ...
}

另一种选择是在 main() 方法中将 Cell 设为本地类:

public class Game {
    public static void main(String[] args) {
        class Cell {
            ...
        }
        Cell c1 = new Cell();
        Cell c2 = new Cell();
        ...
    }
}

但是,您只能在main() 方法本身中使用Cell 类;您无法在游戏的任何其他方法中利用 Cell 结构。

【讨论】:

  • 为什么建议他将其设为静态?在自己的文件中保留一个独立的类不是更干净吗?
  • @HovercraftFullOfEels - OP 说所有东西都需要放在一个文件中。也许这是一项任务,这是规范的一部分。
  • 单元类怎么可能是静态的?不是说只有一个实例吗?各种坐标需要有多个单元格
  • 我确实需要在辅助方法中访问 Cell 类来执行评估
  • @Joseph - 将Cell 类声明为static 并不意味着Cell 只有一个实例;仅适用于类的成员字段。当一个嵌套类not声明为static时,它是一个内部类并且不能从static上下文中实例化:它需要一个外部类的实例来提供上下文。有关更多详细信息,请参阅Java tutorial on nested classes
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
  • 2011-01-03
相关资源
最近更新 更多