1

在这段代码中,我试图创建类的全局实例,以便任何方法都可以使用它:

public static void clip(){
    while(!Display.isCloseRequested()){
        glClear(GL_COLOR_BUFFER_BIT);

        if(character.gravity)character.y++; //there is an error, it says "Variable character does not exist"            
        Display.update();
        Display.sync(70);
    }
}

public static void initGame(){
    entity character = new entity(); // I want to use this in method clip()
    character.create(true, "box", true);
}

我搜索了谷歌,但在我的问题“使类的实例全局化”中一无所获。感谢帮助。

4

5 回答 5

4

如果你想要一个类的全局对象,你可以按如下方式创建一个Singleton 。

class MyClass {
    private MyClass instance = null;
    public static MyClass getInstance() {
        if (instance == null) {
            instance = new MyClass();
        }
        return instance;
    }
}

现在您可以访问“全局”实例:

MyClass global = MyClass.getInstance();
于 2013-08-08T11:51:38.443 回答
3

要使特定类的实例对您的程序全局化,一种解决方案是单例模式。它的工作方式如下:

class Entity {
   private static Entity self = new Entity();
   public static Entity get() { return self; }
}

然后,您可以通过以下方式在代码中的任何位置使用 Entity 类的唯一实例:

Entity.get()
于 2013-08-08T11:48:08.097 回答
1

java中没有“全局变量”之类的东西。

但是,您可以通过以下方式声明character类变量

entity character = new entity();

在方法之外,仅在类范围内。

像这样的东西:

class MyClass { 
  private static entity character = new entity(); //class variable!
  public static void clip(){
      while(!Display.isCloseRequested()){
          glClear(GL_COLOR_BUFFER_BIT);

          if(character.gravity)character.y++; 
          Display.update();
          Display.sync(70);
      }
  }

  public static void initGame(){
      character = new entity(); // it will 'reset' game and bind a new object to the class variable `character`.
      character.create(true, "box", true);
  }
}

有关类变量的更多信息可以在官方文档中。


作为一个侧节点,一个类不应该被命名entity,因为 java 有一个强大的约定,类名应该总是以大写字母开头,你应该把这个类重命名为Entity.

于 2013-08-08T11:47:05.363 回答
0

创建全局类的单例实例,并为其添加静态实例获取器。稍后在您的任何代码中,您将能够获取您的实例并调用其类的任何公共方法。或者,如果您不需要单例,只需使用静态方法。

于 2013-08-08T11:48:24.730 回答
0

在 Java 中,所有对象都应该是变量或类的成员,即使它们是静态成员。C 风格的全局变量不存在。

因此,在您的情况下,要使character从任何地方都可以访问,您应该编写:

public static entity CHARACTER = null;

public static void initGame(){
    CHARACTER = new entity(); // I want to use this in method clip()
    CHARACTER .create(true, "box", true);
}

并且,如果上面的代码来自 class MyClass,下面的代码来自另一个 class:

public static void clip(){
    while(!Display.isCloseRequested()){
        glClear(GL_COLOR_BUFFER_BIT);

        if(MyClass.CHARACTER.gravity) MyClass.CHARACTER.y++; 
        Display.update();
        Display.sync(70);
    }
}

话虽这么说,这段代码(实际上是它的设计)应该改进,因为它绝对不是面向对象的。由于这是另一个问题,我不会在这里进一步详细说明,但建议您进一步研究 OOP 标准和最佳实践。

于 2013-08-08T11:53:00.367 回答