Java 什么&x2018;初始化对象数组和初始化对象之间的区别是什么?

Java 什么&x2018;初始化对象数组和初始化对象之间的区别是什么?,java,arrays,initialization,Java,Arrays,Initialization,例如: Student[]stu=新生[10] 学生stu=新学生() 他们之间有什么区别 初始化对象数组时发生了什么?为什么它不调用构造函数?初始化数组时,所有元素最初都为null。当您创建一个Student对象时,它实际上调用Student构造函数。在数组实例化/初始化中,您分配了足够的内存来容纳10个Student对象。在stu的实例化/初始化中,stu变量引用内存中的一个Student对象初始化数组会为每个元素创建空白。它不创建任何单个元素。这个 Student[] stus = new

例如:


Student[]stu=新生[10]

学生stu=新学生()
他们之间有什么区别


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

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

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

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

Student[] stus = new Student[10];
因此,创建了十个空白,每个空白中可以放置一个
Student
对象。没有其他类型——除非它是子类
学生
。这十个空格中的每一个都是
null
,直到您明确地将一个新对象放入其中。比如

stus[1] = new Student();  //1 is the *second* element
初始化对象将创建该类型的新对象。这个

Student stu = new Student();
创建一个新的
Student
对象。或者,这个

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

重复一下,这将创建(初始化)它——这意味着将它放置在声明的空间中:

最后,正如@FlorentBayle所提到的,您不应该将这些对象命名为相同的名称。考虑我上面提到的数组命名:<代码> STUS ,它更能指示它的实际值。 更多信息:


    • 我同意PakkuDon的观点,我不知道你所说的“
      结构-功能”
      ”是什么意思

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


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

      Student[]stu=newstudent[10]初始化一个包含10个元素的数组,该数组占用
      学生对象的10X大小。但是使用
      stu=newstudent()
      它只占用
      Student
      对象的1x大小

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

      学生stu=新学生()创建一个学生

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


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

      给定
      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[]类型的参考

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

        B[0] = new Student();
        
        C = new Student();
        
      • B[0]
        是数组中的第一个元素
        B
        最初指的是
        null

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

      • C
        是类型为
        Student

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

        B[0] = new Student();
        
        C = new Student();
        
      • C
        将采用
        newstudent()返回的引用

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

      你所说的结构功能是什么意思?您是指构造函数吗?
      stu=new Student()stu
      是刚才声明的
      Student
      的数组,则code>将不起作用。如果不是,你真的应该选择另一个名字。关于数组的Java教程。@PakkuDon谢谢,我不是来自英语国家。