java初始化一个类字段 对不起,C++程序员新到java再次攻击

java初始化一个类字段 对不起,C++程序员新到java再次攻击,java,class,initialization,field,Java,Class,Initialization,Field,我有这个密码 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[

我有这个密码

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,但这似乎很麻烦,也没有必要


也许我的想法完全错了,请启发我,谢谢你可以用两种方法-

  • 使您的内部类保持静态

  • MainView
    object的帮助下,创建
    DrumEventDrawStuff
    对象

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


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

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

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

    static class DrumEventDrawStuff {
        ...
    }
    
    此时,您可能想知道为什么可以在静态上下文中使用非静态的
    EventDrawStuff


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

    谢谢,我将内部类设置为静态的,它解决了我所问的问题。然而,我对第一份声明还有另一个问题。我把东西也做成了静态的。我猜想,初始化代码确实会创建100个指针,而不是C++中的100个EdvestDraseDebug结构。我现在是否需要使用新的EventDrawStuff()遍历并初始化m_drawList中的每个元素?@steveh java中没有指针:)。它将创建100个索引数组来容纳100个
    EventDrawStuff
    引用。谢谢,我意识到java中没有所谓的指针,但实际上我的示例中的m_drawList[]是一个指针数组(或引用,如果您愿意的话)。在c/c++中,我本可以创建一个数据结构数组,但我想这在这里是不可能的
    EventDrawStuff[]
    是自定义数据结构的数组