如何在Java中创建对象数组

KDM*_*KDM 5 java arrays object

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

我的代码

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;

    }       
}
Run Code Online (Sandbox Code Playgroud)

给出错误

线程"main"java.lang.NullPointerException中的异常.

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

public class Test {

    private static int[] foo;

    public static void main(String args[]) {

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

    }       
}
Run Code Online (Sandbox Code Playgroud)

这似乎工作.我只是看不出我的两个例子之间的区别.(我知道我的第一个没有意义,但MyClass最终将包含更多数据.)

我很确定这里会问这个问题并得到很好的回答.我想我实施了解决方案:

MyClass[] foo = new MyClass[10];
foo[0] = new MyClass();
foo[0].bar = 0;
Run Code Online (Sandbox Code Playgroud)

但上面的第二行发出错误

不能访问类型为Test的封闭实例.

我确实理解ArrayList是一种前进的方式,但我正在努力掌握底层的概念.

注意 - 知道虽然对编程非常熟悉,但是Java是我第一次进入面向对象的编程可能会很有用.

Rah*_*ate 6

它class MyClass是一个inner class,而不是一个子类.可以通过创建包含内部类的类的对象来访问非静态内部类.因此,如果要访问内部类,则必须首先创建外部类的对象.你可以这样做:

Test t = new Test();
MyClass[] foo = new MyClass[10];
foo[0] = t.new MyClass();
foo.bar = 0;
Run Code Online (Sandbox Code Playgroud)


Duk*_*ing 3

原因int有效,但MyClass无效:

从这里:

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

附加说明:

从技术上讲,这个:

int[] foo = new int[1];
foo[0] = 0;
Run Code Online (Sandbox Code Playgroud)

实际上更像是这样:

MyClass[] foo = new MyClass[10];
foo[0] = new MyClass();
Run Code Online (Sandbox Code Playgroud)

不是:

MyClass[] foo = new MyClass[10];
foo[0].bar = 0;
Run Code Online (Sandbox Code Playgroud)

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

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

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

无法访问类型的封闭实例。

无法访问 Server 类型的封闭实例

从 Android 中的另一个类调用方法时出现“没有类型的封闭实例”错误