创建类的全局实例 - JAVA

时间:2013-08-08 11:41:57

标签: java class global-variables instance

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

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

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

5 个答案:

答案 0 :(得分:1)

java中没有“全局变量”这样的东西。

但是,您可以通过声明:{/ p>将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);
  }
}

More info on class variables can be in the official documentation


作为一个副节点,一个类不应该被命名为entity,因为java有一个强大的约定,类名应该总是以大写字母开头,你应该将这个类重命名为Entity。 / p>

答案 1 :(得分:1)

如果您想为一个类创建一个全局对象,可以按如下方式创建 Singleton

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

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

MyClass global = MyClass.getInstance();

答案 2 :(得分:0)

要为程序创建特定类的全局实例,一种解决方案是Singleton模式。它的工作方式如下:

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

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

Entity.get()

答案 3 :(得分:0)

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

答案 4 :(得分: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);
}

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

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标准和最佳实践。