用Java创建一个类数组

Gra*_*ike -1 java arrays static class

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

SceneObject[] scenes = {Loading.class, Menu.class};
// Loading and Menu extend SceneObject
Run Code Online (Sandbox Code Playgroud)

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

编辑:

以下是我们正在努力实现的目标.我们也可以使用很多开关,但在每种方法中将每个对象添加到每个开关听起来都是多余的.

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);
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

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

SceneObject[] scenes = { new Loading(), new Menu() };
Run Code Online (Sandbox Code Playgroud)

要么

Class[] classes = { Loading.class, Menu.class };
Run Code Online (Sandbox Code Playgroud)

从你的问题中你不清楚你的意思,但希望这应该满足任何一种情况......请注意,你不能拥有泛型数组,所以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() {
    }
}
Run Code Online (Sandbox Code Playgroud)

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() {
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以写:

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

...

for (SceneObject scene : scenes) {
    scene.foo();
    scene.bar();
}
Run Code Online (Sandbox Code Playgroud)

  • @GraysonPike:你为什么这么反对创建实例?这不像你需要创建*lot*这些实例.不要与语言作斗争. (2认同)