Java初始化一个字段,它是一个类



抱歉,c++程序员对Java又不熟悉了

我有这个代码

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,但这似乎很麻烦且不必要。

也许我完全理解错了,请指教一下,谢谢

有两种方法-

  1. 使用MainView对象创建DrumEventDrawStuff对象

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

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

如果你将DrumEventDrawStuff设置为静态类,那么你就可以了,因为这将删除隐式的外部this:

static class DrumEventDrawStuff {
    ...
}
在这一点上,您可能想知道为什么非静态EventDrawStuff类可以在静态上下文中使用。

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

因为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();

相关内容

  • 没有找到相关文章

最新更新