0

抱歉,刚接触java的c++程序员又来了

我有这个代码

public class MainView extends View {

    static final int DRAW_LIST_SIZE=100;
    class EventDrawStuff {
        int         a;
        int         b;
        int         c;
    }
    static EventDrawStuff   m_drawList[] = new EventDrawStuff[DRAW_LIST_SIZE];

    class DrumEventDrawStuff {
        int     x;
        int     y;
    } 
    static DrumEventDrawStuff m_eventDrawStuff = new DrumEventDrawStuff();

m_drawList 的声明似乎工作正常,m_eventDrawStuff 的声明无法编译。有什么区别,不能只是 m_drawList 是一个数组吗?我注意到如果我说

static DrumEventDrawStuff[] m_eventDrawStuff = new DrumEventDrawStuff[1];

没关系,但我真的不希望它是一个数组,因为它只是一个东西。我意识到修复原始代码的方法是在构造函数中初始化 m_eventDrawStuff 但这似乎很麻烦且不必要。

也许我的想法完全错误,请赐教,谢谢

4

3 回答 3

1

你可以通过两种方式做到这一点 -

  1. 使您的内部类静态

  2. DrumEventDrawStuff在对象的帮助下创建MainView对象。

    static DrumEventDrawStuff m_eventDrawStuff = new MainView().new DrumEventDrawStuff();

于 2013-01-11T07:18:26.587 回答
1

问题是您试图DrumEventDrawStuff在静态上下文中实例化 a 。DrumEventDrawStuff是 的内部类MainView,这意味着 的每个实例都有对持有它DrumEventDrawStuff的实例的隐式引用(“外部 this”)。MainView

如果您创建DrumEventDrawStuff一个静态类,那么您就可以了,因为这将删除隐式外部this

static class DrumEventDrawStuff {
    ...
}

此时您可能想知道为什么非静态EventDrawStuff类可以在静态上下文中使用。

答案是您实际上并没有在创建数组时创建任何实例EventDrawStuff与 C++ 不同,Java 在创建新数组时不会实例化任何对象。因此,静态声明和创建数组是完全可以的,EventDrawStuff因为它将填充空值。

于 2013-01-11T07:22:54.093 回答
0

由于 DrumEventDrawStuff 在这里是一个非静态内部类,它需要一个 MainView 的“环绕”实例。没有它,它就不能被实例化。

您的数组 m_drawList 只是没有 EventDrawStuff 实例的数组,否则您会遇到同样的问题。

如果你真的想要那些静态字段,类必须是静态的,所以它们不需要周围的实例:

public class MainView extends View {

static final int DRAW_LIST_SIZE=100;
static class EventDrawStuff {
    int         a;
    int         b;
    int         c;
}
static EventDrawStuff   m_drawList[] = new EventDrawStuff[DRAW_LIST_SIZE];

static class DrumEventDrawStuff {
    int     x;
    int     y;
} 
static DrumEventDrawStuff m_eventDrawStuff = new DrumEventDrawStuff();
于 2013-01-11T07:21:01.313 回答