我们如何在Java中创建任何类或接口的数组?

时间:2015-11-16 06:13:39

标签: java arrays class interface

我想问一个让我困惑的问题,而不是java中的任何其他问题。

当我们创建一个引用数组时。究竟发生了什么? 例如,我有

class A {
    String name;      
}

当我们创建像

这样的数组时
  A[] arr = new A[5];

。究竟发生了什么?是否调用了构造函数?如果不是那么内部会发生什么?

由于数组是对象,我们如何能够做到这一点,例如

interface G {
  void disp();     
 }
 G[] x = new G[5];

请帮我消除困惑。它阻碍了我进行许多其他操作。

2 个答案:

答案 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循环来初始化阵列元素。

Refrence