初始化一个对象数组和初始化一个对象有什么区别?

时间:2014-03-09 05:41:58

标签: java arrays initialization

例如:

Student[] stu = new Student[10];

Student stu = new Student(); 它们之间有什么区别?

初始化对象数组时发生了什么?为什么不调用构造函数?

7 个答案:

答案 0 :(得分:2)

初始化数组会为每个元素创建空格。它不会创建任何单个元素。此

Student[] stus = new Student[10];
因此,

创建了十个空白空间,每个空白空间可以放置一个Student对象。没有其他类型 - 除非它是子类Student。这十个空格中的每一个都是null,直到您明确地将新对象放入其中。比如

stus[1] = new Student();  //1 is the *second* element

初始化对象会创建该类型的新对象。此

Student stu = new Student();

创建一个新的Student对象。或者,这个

Student stu;

声明对象,但不创建它。就像初始化数组时一样。这为(一个)Student对象分配了一个空间,但没有创建它。

要重复,这会创建(初始化)它 - 意味着将其放置在声明的空间中

stu = new Student();

最后一点,正如@FlorentBayle所提到的,你不应该将这些对象命名为相同。考虑如上所述命名数组:stus,这更能说明其实际值。

更多信息:

答案 1 :(得分:1)

鉴于Student.java

public class Student
{
    private String name;

    public Student () { name = ""; }

    public String getName () { return name; }

    public void setName (String name) { this.name = name; }
}

然后我们有:

    Student[] A = null;
  • AStudent[]类型的引用,表示学生参考数组
  • 引用是内存地址
  • A的值为null;意思是什么都没有

    Student[] B = new Student[10];
    
  • BStudent[]

  • 类型的引用
  • new Student[10];将保留10个Student
  • 类型的内存引用的内存
  • B获取new返回的引用,该引用引用了10个Student引用块
  • new保留的所有参考块都已初始化为null
  • 尝试B[0].getName();将编译,但会在运行时抛出NullPointerException

    B[0] = new Student();
    
  • B[0]是数组B中第一个引用null

  • 的元素
  • new Student();将通过调用其构造函数Student来创建类型为Student()的对象,该构造函数称为默认构造函数
  • 在此之后,您可以拨打B[0].getName();

    等学生功能
    Student C = null;
    
  • CStudent

  • 类型的引用
  • C的值为null,这意味着它不会引用任何内容
  • 尝试C.getName();将编译,但会在运行时抛出NullPointerException

    C = new Student();
    
  • C将获取new Student();

  • 返回的引用
  • new Student();将通过调用其构造函数Student并返回其内存引用来创建Student()类型的对象

答案 2 :(得分:0)

初始化数组时,最初所有元素都为null。当你创建一个Student对象时,它实际上会调用Student构造函数。

答案 3 :(得分:0)

在数组实例化/初始化中,您正在分配足够的内存来容纳10个Student对象。在stu的实例化/初始化中,您的stu变量引用内存中的一个Student对象

答案 4 :(得分:0)

我同意PakkuDon,不知道你的意思是“Structure Function。”

初始化一个对象数组将创建一个新的Student个对象数组,它基本上是一个大小为Student[x]的列表,其中x是数组中的对象数。 当您实际向数组添加Student对象时,它将调用Student构造函数,并创建Student对象。

简单地创建一个Student对象实际上会创建对象,而不仅仅是一个可以容纳它们的列表。

答案 5 :(得分:0)

Student[] stu = new Student[10];中初始化一个包含10个元素的数组,这些元素占用Student个对象的10倍。但是stu = new Student();只占Student个对象的1xsize。

答案 6 :(得分:0)

Student[] stu = new Student[10];创建一个可容纳10个Student对象的数组。每个元素都初始化为null。

Student stu = new Student();创建一个学生。

关于为什么在构造对象数组时没有调用构造函数的问题,我会问“为什么会这样?”编译器只知道数组可以存储作为Student实例的对象。编译器应该如何知道它应该调用哪个构造函数来构造这些对象?如果您的类Student缺少no-args构造函数,编译器应该怎么做?

还有一个事实是,程序员可能希望在运行时使用从外部源检索的数据填充数组。默认为null而不是用一堆随后将被丢弃的任意实例填充数组会更有意义,因为这会给程序增加不必要的开销。

相关问题