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是我第一次进入面向对象的编程可能会很有用.
它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)
原因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 个相关问题:
从 Android 中的另一个类调用方法时出现“没有类型的封闭实例”错误