JavaRush /Java 博客 /Random-ZH /构造函数和普通方法的区别。
fog
第 18 级

构造函数和普通方法的区别。

已在 Random-ZH 群组中发布
构造函数是一种特殊方法,旨在初始设置对象字段的值。 乍一看,对象构造函数与普通对象方法没有太大区别。事实上,在构造函数内部,我们可以做常规对象方法中可以做的所有事情:将文本输出到控制台、访问新对象的所有字段和方法、抛出异常等等。就像常规方法一样,构造函数可以有参数。就像重载方法一样,可以有多个具有不同签名的构造函数。就像泛型方法一样,构造函数可以通过类型变量进行参数化。即使我们查看编译器生成的字节码,在应该调用构造函数的地方,我们也会发现对某个方法的调用,其名称与对其他方法的调用没有什么不同<init>。物体。找到该方法的字节码后,我们会发现它包含编译构造函数的结果。看似与传统方法没有太大区别,但它们是存在的,而且是相当显着的。首先,让我们弄清楚,为什么我们实际上需要构造函数?为了存储和处理任何数据,无论是原始类型、数组还是对象,我们都需要一定量的内存。这可以是处理器寄存器、堆栈空间或在进程数据部分中分配的一块空间,或者在内存的动态分配部分(堆)中。在许多编程语言中,为了加速目的,当程序请求一块新的内存时,该内存会被分配给未清除的程序,并且可以包含之前存储在该内存单元中的任意数据。准备必要的值并将其写入这样的一块内存中,以便最终在那里出现一些有意义的数据结构,这完全落在了程序员的肩上。很自然地,程序员希望让他们的生活更轻松,并编写例程来初始化(即设置初始值)常用的数据结构。此类例程几乎经常被使用,因此 Java 语言的创建者决定在创建对象时强制调用此类初始化例程,并将它们称为构造函数。当在 Java 中创建一个新对象时,会发生以下情况:首先,Java 内存管理器分配容纳该对象所需的内存量。在这种情况下,不仅会考虑在所创建对象的类中直接声明的字段,还会考虑在该类的所有祖先中声明的字段。此外,该卷还包括用于放置 Java 机器用于内部需要的结构的空间。这种“空白”的所有字段都会自动设置为默认值 -对于null引用类型、0数字和falseboolean。此后,会自动调用类构造函数,其任务是设置对象字段的初始值。虽然在普通方法中,第一个语句可以是任何内容,但构造函数的自由度要小得多。构造函数的第一条语句必须是对同一类的另一个构造函数的显式调用,或者是对父类的构造函数的显式或隐式调用。this使用关键字后跟一组括在括号中的参数来显式调用同一类的构造函数。显式调用父类的构造函数的方式完全相同,但使用了关键字super。在对同一类或父类的构造函数的显式调用的参数中,您无法访问对象的字段和方法,也不能使用关键字thisand super,因为对构造函数的显式调用会引入静态上下文。要隐式调用父类的构造函数,不需要编写任何内容,但会隐式调用默认构造函数,该构造函数必须存在且对当前类可见。同时,应该记住,如果调用父构造函数的链在位于Object链顶部的类构造函数成功完成其工作之前被中断,那么该对象将不会是可终结的,即该方法finalize()这样一个对象的永远不会被调用。父类构造函数完成后,控制权将隐式转移到当前类的实例初始值设定项块和实例字段初始值设定项。初始化程序按照它们在程序文本中出现的顺序执行。只有在初始化程序完成其工作后,控制权才会转移到构造函数的其余部分。构造函数的其余功能与 Java 内存模型有关。如果一个类或其祖先之一重写了该方法finalize(),则构造函数的完成将发生在该方法运行之前(发生之前finalize()) 。如果任何线程在构造函数完成后看到对对象的引用,则可以保证该线程将看到该final对象的正确初始化的字段,该对象的初始化发生在构造函数完成之前。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION