【问题标题】:java initializing a field which is a classjava初始化一个类的字段
【发布时间】:2013-01-11 07:14:53
【问题描述】:

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

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

【问题讨论】:

    标签: java class initialization field


    【解决方案1】:

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

    1. 让你的内部类静态

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

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

    【讨论】:

    • 谢谢,我将内部类设为静态,它解决了我询问的问题。但是,我对第一个声明还有另一个问题。我也将 EventDrawStuff 设为静态。我猜我的初始化代码确实创建了 100 个指针,而不是像在 c++ 中那样创建 100 个 EventDrawStuff 数据结构。我现在是否需要使用新的 EventDrawStuff() 初始化 m_drawList 中的每个元素?
    • @steveh java 中没有指针 :)。它将创建 100 个索引数组来保存 EventDrawStuff 的 100 个引用。
    • 谢谢,我意识到 java 中没有什么叫指针,但实际上我的示例中的 m_drawList[] 是一个指针数组(或者如果您愿意,可以引用)。在 c/c++ 中,我本可以创建一个数据结构数组,但我想这在这里是不可能的。
    • 你可以。 EventDrawStuff[] 是自定义数据结构的数组
    【解决方案2】:

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

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

    static class DrumEventDrawStuff {
        ...
    }
    

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

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

    【讨论】:

      【解决方案3】:

      由于这里的 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();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多