【问题标题】:How to create an Array of Objects in Java如何在 Java 中创建对象数组
【发布时间】:2013-04-30 01:53:07
【问题描述】:

我正在尝试创建由子类定义的对象数组(我认为这是正确的术语)。我可以看到问题反复出现,但实施仍然存在问题。

我的代码

public class Test {

    private class MyClass {
        int bar = -1;
    }

    private static MyClass[] foo;

    public static void main(String args[]) {

        foo = new MyClass[1];
        foo[0].bar = 0;

    }       
}

给出错误

线程“主”java.lang.NullPointerException 中的异常。

为了使其合理化,我将其分解为最简单的术语:

public class Test {

    private static int[] foo;

    public static void main(String args[]) {

        foo = new int[1];
        foo[0] = 0;

    }       
}

这似乎有效。我只是看不出我的两个例子之间的区别。 (我知道我的第一个毫无意义,但 MyClass 最终会包含更多数据。)

我很确定这个问题被问到here 并且得到了很好的回答。我想我实现了解决方案:

MyClass[] foo = new MyClass[10];
foo[0] = new MyClass();
foo[0].bar = 0;

但是上面的第二行出现了错误

没有可访问类型为 Test 的封闭实例。

我确实理解 ArrayList 将是一个前进的方向,但我正在努力掌握基本概念。

注意 - 知道 Java 是我第一次涉足面向对象编程时,虽然总体上对编程非常熟悉,但这可能会很有用。

【问题讨论】:

  • 关于 nested classes 的 Java 教程章节可能是一本关于内部类基础知识的有趣读物。

标签: java arrays object


【解决方案1】:

您最后遇到的问题(“没有封闭实例”)实际上与数组无关。

尝试用这个替换你的最后一个代码块:

 MyClass foo = new MyClass();

即使不涉及数组,您也会收到完全相同的错误消息。

这里的问题是非静态内部类有一个对其外部实例的隐式引用。由于您没有外部实例(您处于静态上下文中,因此没有 this),因此无法创建 MyClass 实例。

可能不需要/想要一个内部类,并且可以简单地使其成为static

private static class MyClass

另外:您的代码使用 int 而不是 MyClass 的原因是 int[] 拥有 intint 是原始类型),而MyClass[] 持有MyClass 引用MyClass 是引用类型)。

【讨论】:

    【解决方案2】:

    classMyClassinner class,并且不是子类。可以通过创建包含内部类的类对象来访问非静态内部类。所以,如果你想访问内部类,你必须先创建一个外部类的对象。你可以这样做:

    Test t = new Test();
    MyClass[] foo = new MyClass[10];
    foo[0] = t.new MyClass();
    foo.bar = 0;
    

    【讨论】:

    • 我不确定这是否是我想要做的:测试是我最重要的课程,我不认为我想创建它的实例。感谢收看。
    • @KDM 如果您不想创建Test 的实例,那么您可能需要将MyClass 设为静态。
    【解决方案3】:

    您不能在静态 main 方法中使用非静态内部类。

    解决方案是将MyClass 声明为private static class

    【讨论】:

      【解决方案4】:

      int 有效,但 MyClass 无效的原因:

      来自here

      Data Type               Default Value (for fields)
      byte                    0
      short                   0
      int                     0
      long                    0L
      float                   0.0f
      double                  0.0d
      char                    '\u0000'
      String (or any object)  null
      boolean                 false
      

      初始化数组时,所有元素都采用默认值。

      因此,当您初始化 int[] 时,所有元素都是 0,因此使用它或为其分配新值没有问题。

      但是,当您初始化 MyClass[] 时,所有元素都是 null,当您尝试访问其中一个元素的成员时,这是一个问题。

      如果您不知道为什么无法访问 null 对象的成员,您可能需要退后两步,阅读一本 Java 书籍。

      补充说明:

      从技术上讲,这是:

      int[] foo = new int[1];
      foo[0] = 0;
      

      其实更像这样:

      MyClass[] foo = new MyClass[10];
      foo[0] = new MyClass();
      

      不是:

      MyClass[] foo = new MyClass[10];
      foo[0].bar = 0;
      

      因为您正在为元素分配新值,而不是访问元素的成员。

      无法访问 Test 类型的封闭实例:

      其他答案很好地涵盖了这一点,这里有 3 个相关问题:

      No enclosing instance of type is accessible.

      No enclosing instance of type Server is accessible

      "No enclosing instance of type" error while calling method from another class in Android

      【讨论】:

      • 所有精彩的答案,都很有用,但这是我在 Java 职业生涯的这个阶段最有意义的答案!
      猜你喜欢
      • 1970-01-01
      • 2011-07-18
      • 1970-01-01
      • 2020-12-17
      • 1970-01-01
      • 2010-12-31
      • 2013-12-12
      • 2011-07-31
      相关资源
      最近更新 更多