java - 在 Java 中创建类数组

标签 java arrays class static

是否可以在 Java 中创建静态类数组? 例如:

SceneObject[] scenes = {Loading.class, Menu.class};
// Loading and Menu extend SceneObject

我们需要通过数组调用静态方法,而不是实例化它们。

编辑:

以下是我们正在努力完成的工作。我们也可以使用许多开关,但将每个对象添加到每个方法中的每个开关听起来是多余的。

package net.bitworm.gameengine;

import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;

import net.bitworm.scenes.*;

public class SceneController {

public enum Scene{
    LOADING_SCENE,
    MENU,
    SCENE_1
}

public static SceneObject[] scenes = {new Loading(), new Menu()};

public volatile static Scene currentScene = Scene.LOADING_SCENE;

public static void setScene(Scene newScene){
    currentScene = newScene;
    System.out.println("Switched to " + currentScene.toString());
}

public static void update(GameContainer container, int delta){
    scenes[currentScene.ordinal()].update(container, delta);
}
public static void render(GameContainer container, Graphics g){
    scenes[currentScene.ordinal()].render(container, g);
}
public static void mouseMoved(int oldx, int oldy, int newx, int newy){
    scenes[currentScene.ordinal()].mouseMoved(oldx, oldy, newx, newy);
}
public static void mousePressed(int button, int x, int y){
    scenes[currentScene.ordinal()].mousePressed(button, x, y);;
}
public static void mouseReleased(int button, int x, int y){
    scenes[currentScene.ordinal()].mouseReleased(button, x, y);
}
public static void mouseWheelMoved(int change){
    scenes[currentScene.ordinal()].mouseWheelMoved(change);
}
public static void keyPressed(int key, char c){
    scenes[currentScene.ordinal()].keyPressed(key, c);
}
public static void keyReleased(int key, char c){
    scenes[currentScene.ordinal()].keyReleased(key, c);
}

最佳答案

您需要区分对象。例如,您可能有:

SceneObject[] scenes = { new Loading(), new Menu() };

Class[] classes = { Loading.class, Menu.class };

从你的问题中不清楚你的意思,但希望这应该满足任何一种情况......请注意你不能有通用数组,所以使用 Class[] 你不能指定每个类都必须扩展 SceneObject

编辑:现在我们得到了更多信息,听起来你已经得到了这个:

abstract class SceneObject {}

class Menu extends SceneObject {
    static void foo() {
    }

    static void bar() {
    }
}

class Loading extends SceneObject {
    static void foo() {
    }

    static void bar() {
    }
}

这里的两个 foo 方法是完全不相关的 - 你不能使用多态来调用它们,因为它们是静态方法。如果你想使用多态性——即调用一个知道你想调用哪个签名的方法,但实现取决于调用的目标——你需要实例方法:

abstract class SceneObject {
    abstract void foo() {
    }

    abstract void foo() {
    }
}

class Menu extends SceneObject {
    @Override void foo() {
    }

    @Override void bar() {
    }
}

class Loading extends SceneObject {
    @Override void foo() {
    }

    @Override void bar() {
    }
}

然后你可以这样写:

SceneObject[] scenes = { new Loading(), new Menu() };

...

for (SceneObject scene : scenes) {
    scene.foo();
    scene.bar();
}

关于java - 在 Java 中创建类数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27729607/

相关文章:

java - 尝试连接到 FireStore 数据库但收到 "Program type already present: okio.Buffer$2"

java - 克隆/复制对象

php - 如何找到多维数组中每个元素的所有唯一组合

java图像白色提取

java - 绘图 : eg. Graphics.drawRect 或 Rectangle.draw 之间的差异

python - 如何从包含不同长度的 numpy 数组的 numpy 数组中获取唯一元素?

java - 将 java 字节数组转换为字符串

c++ - C++ 中的每个对象是否都包含不同版本的类成员函数?

function - 如何在 Kotlin 中初始化嵌套数据类?

python - 如果我将类的第二个实例归因于包含现有实例的相同变量,会发生什么情况?