例如:
Student[] stu = new Student[10];
Student stu = new Student();
它们之间有什么区别?
初始化对象数组时发生了什么?为什么不调用构造函数?
答案 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;
A
是Student[]
类型的引用,表示学生参考数组 A
的值为null
;意思是什么都没有
Student[] B = new Student[10];
B
是Student[]
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;
C
是Student
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
而不是用一堆随后将被丢弃的任意实例填充数组会更有意义,因为这会给程序增加不必要的开销。