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[]
是自定义数据结构的数组