在这段代码中,我试图创建类的全局实例,以便任何方法都可以使用它:
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);
}
我搜索了谷歌,但在我的问题“使全局类的实例”一无所获。 谢谢你的帮助。
答案 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标准和最佳实践。