5

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

我的代码

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 最终将包含更多数据。)

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

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

但上面的第二行发出错误

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

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

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

4

4 回答 4

6

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

Test t = new Test();
MyClass[] foo = new MyClass[10];
foo[0] = t.new MyClass();
foo.bar = 0;
于 2013-05-06T10:22:58.933 回答
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

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

因此,当您初始化 时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 个相关问题:

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

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

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

于 2013-05-06T10:36:28.777 回答
3

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

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

 MyClass foo = new MyClass();

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

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

可能不需要/想要一个内部类,并且可以简单地制作它static

private static class MyClass

另外:您的代码使用int而不是使用的原因MyClass是 anint[]保存intint是原始类型),而 aMyClass[]保存MyClass 引用MyClass是引用类型)。

于 2013-05-06T10:19:48.940 回答
0

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

解决方案是声明MyClassprivate static class.

于 2013-05-06T10:35:54.423 回答