有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我想问一个在java中最让我困惑的问题

当我们创建一个引用数组时。到底发生了什么? 我有

class A {
    String name;      
}

当我们创建一个类似

  A[] arr = new A[5];

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

既然数组是对象,我们如何才能做到这一点呢

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

请帮我消除困惑。它妨碍了我进行其他许多行动


共 (2) 个答案

  1. # 1 楼答案

    创建阵列时:

      A[] arr = new A[5]
    

    不调用任何构造函数,您要做的唯一一件事就是指定对A的引用的连续内存范围

    • 您可以通过尝试访问特定索引处的数组来测试它:

      A温度=arr[0]

    你会看到temp变量为null,这意味着它的实例是未定义的

    • 引用不是对象,而是对对象的引用。它就像一个标志,指向记忆中的某个地方,你可以找到并访问该对象

    我不明白如何创建interface的实例

  2. # 2 楼答案

    对象数组的创建方式与基本类型数据项数组的创建方式类似,如下所示:

    Student[] studentArray = new Student[7];
    

    下面是这个类的定义

    class Student {
       int marks;
    }
    

    上面的语句创建了一个数组,该数组可以保存对七个学生对象的引用。它不会创建学生对象本身。它们必须使用Student类的构造函数单独创建。studentArray包含七个存储空间,其中可以存储七个Student对象的地址。如果我们甚至在创建学生对象之前就尝试访问它们,就会发生运行时错误。例如,下面的语句在运行时抛出NullPointerException,这表明studentArray[0]尚未指向学生对象

    studentArray[0].marks = 100;
    

    必须使用Student类的构造函数实例化Student对象,并且应该按照以下方式将其引用分配给数组元素

    studentArray[0] = new Student();
    

    这样,我们也可以创建其他学生对象。如果必须使用不同的构造函数创建每个学生对象,我们会多次使用类似于上述的语句。然而,在这种特殊情况下,我们可以使用for循环,因为所有学生对象都是使用相同的默认构造函数创建的

    for ( int i=0; i<studentArray.length; i++) {
    studentArray[i]=new Student();
    }
    

    上面的for循环创建七个学生对象,并将其引用指定给数组元素。下面这样的陈述是有效的

    studentArray[0].marks=100;
    

    增强for循环在这里找到了一个更好的应用程序,因为我们不仅可以得到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