我想问一个让我困惑的问题,而不是java中的任何其他问题。
当我们创建一个引用数组时。究竟发生了什么? 例如,我有
class A {
String name;
}
当我们创建像
这样的数组时 A[] arr = new A[5];
。究竟发生了什么?是否调用了构造函数?如果不是那么内部会发生什么?
由于数组是对象,我们如何能够做到这一点,例如
interface G {
void disp();
}
G[] x = new G[5];
请帮我消除困惑。它阻碍了我进行许多其他操作。
答案 0 :(得分:2)
创建数组时:
A[] arr = new A[5]
没有调用构造函数,你唯一要做的就是指定一个连续的内存范围,引用A。
您可以尝试访问特定索引处的数组来测试它:
临时= arr [0];
你会看到temp变量为null,这意味着它的实例未定义。
我不明白你怎么能创建一个界面实例?
答案 1 :(得分:0)
以下列方式创建一个对象数组,就像一个基本类型数据项数组:
Student[] studentArray = new Student[7];
以下是此课程的定义。
class Student {
int marks;
}
上面的语句创建了可以保存对七个Student对象的引用的数组。它本身并不创建Student对象。必须使用Student类的构造函数单独创建它们。 studentArray包含七个存储空间,其中可以存储七个Student对象的地址。如果我们尝试在创建它们之前访问Student对象,则会发生运行时错误。例如,以下语句在运行时抛出NullPointerException,表示studentArray [0]尚未指向Student对象。
studentArray[0].marks = 100;
必须使用Student类的构造函数实例化Student对象,并且应按以下方式将其引用分配给数组元素。
studentArray[0] = new Student();
通过这种方式,我们也创建了其他Student对象。如果必须使用不同的构造函数创建每个Student对象,我们会多次使用与上面类似的语句。但是,在这种特殊情况下,我们可能会使用for循环,因为所有Student对象都是使用相同的默认构造函数创建的。
for ( int i=0; i<studentArray.length; i++) {
studentArray[i]=new Student();
}
上面的for循环创建了七个Student对象,并为数组元素分配了它们的引用。现在,像下面这样的陈述是有效的。
studentArray[0].marks=100;
增强的for循环在这里找到了更好的应用程序,因为我们不仅获得了Student对象,而且我们还能够修改它。这是因为Student是一个引用类型。因此,增强的for循环的标题中的变量将存储对Student对象的引用,而不是Student对象的副本,这是基本类型变量(如int)用作数组元素时的情况。
for ( Student x : studentArray ) {
x.marks = s.nextInt(); // s is a Scanner object
}
回想一下,当数组类型为int时,我们无法以类似的方式分配数组元素。
此外,在对象数组的情况下,当我们将一个数组元素传递给一个方法时,该对象很容易发生变化。这是因为传递的元素也是引用类型项。这与我们有一个int数组的情况不同。以下说明了这个概念。
public static void main(String[] args) {
Student[] studentArray = new Student[7];
studentArray[0] = new Student();
studentArray[0].marks = 99;
System.out.println(studentArray[0].marks); // prints 99
modify(studentArray[0]);
System.out.println(studentArray[0].marks); // prints 100 and not 99
// code
}
public static void modify(Student s) {
s.marks = 100;
}
比较输出与数组类型为int []时的输出。
处理对象数组与处理基本类型数组非常相似。唯一需要记住的是在运行时抛出NullPointerException的可能性,并且还记住数组元素本身是引用类型,这与它们作为参数传递时的情况有细微差别。此外,可以使用增强的for循环来初始化阵列元素。