我可以这样做:
public class className {
public static void main(String[] args){
Storage<Book> bookstorage = new Storage<Book>(100);
}
public class Storage<E> implements GenStorage<E>{
private int size;
private E [] array = (E[]) new Object[100];
public Hylle(int size){
this.size = size;
for (int i = 0; i<size; i++){
array[i] = null;
}
}
虽然这给了我一个ArrayIndexOutOfBoundsException:
public class Storage<E> implements GenStorage<E>{
private int size;
private E [] array = (E[]) new Object[size];
public Hylle(int size){
this.size = size;
for (int i = 0; i<size; i++){
array[i] = null;
}
}
当数组的大小等于或大于对象的设置大小时,程序运行。为什么会发生这种情况,我该如何解决?提前谢谢。
编辑:修正了,我只需要这样做:
public class Storage<E> implements GenStorage<E>{
private int size;
private E [] array;
public Hylle(int size){
this.size = size;
array = (E[]) new Object[size];
for (int i = 0; i<size; i++){
array[i] = null;
}
}
答案 0 :(得分:2)
字段初始值设定项在构造函数体之前执行。在你的第二个例子中:
private int size;
private E [] array = (E[]) new Object[size];
创建一个大小为0的数组,因为这是int的默认值。然后:
for (int i = 0; i < size; i++){
array[i] = null;
}
将尝试索引大小为0的数组,从而导致ArrayIndexOutOfBoundsException
。
第二个示例有效,因为您明确地将其大小设置为100.因此,传递给构造函数的大小实际上从未用于在两个示例中初始化数组。
答案 1 :(得分:0)
Array Object不会自动扩展其大小。这就是他们引入ArrayList的原因,其中数组的大小发生了变化。我可能会建议你尝试使用ArrayList来避免这个问题。
答案 2 :(得分:0)
因为您正在构造函数外部初始化成员变量。这种初始化发生在超级构造函数之间和当前类的构造函数之前。这意味着你的构造函数是这样的:
public Hylle(int size){
// super constructor
super();
// out constructor initialization
this.size = 0;
this.array = (E[]) new Object[size]; // which is 0
// this constructor
this.size = size;
for (int i = 0; i<size; i++){
array[i] = null;
}
}
很容易看到数组是用0大小创建的。