java初始化一个类的字段

时间:2013-01-11 07:14:53

标签: java class initialization field

抱歉,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,但这看起来很麻烦且不必要。

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

3 个答案:

答案 0 :(得分:1)

你可以用两种方式做到 -

  1. 让你的内部类静态

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

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

答案 1 :(得分:1)

问题在于您尝试在静态上下文中实例化DrumEventDrawStuffDrumEventDrawStuffMainView的内部类,这意味着DrumEventDrawStuff的每个实例都隐含了对包含它的MainView实例的引用(“this this”)

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

static class DrumEventDrawStuff {
    ...
}

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

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

答案 2 :(得分: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();