Java中的构造函数是方法吗?是一种特殊的方法吗?
为什么?是什么让构造函数成为方法或不是方法?
有说它是一个方法的例子,比如Java 中的 Constructor:
构造函数是类的一种特殊方法,只要声明了该类的对象,就会自动调用该方法。
以及你应该知道的 Java 中的 12 条覆盖规则中所说的相反的例子:
因为构造函数不是方法
...
我在问构造函数是否是一种方法。
我不是在问什么是构造函数或什么是方法。也没有什么不同或相似之处。这些问题可能与构造函数是否是方法有关,但它们不是问题的主要主题。
看起来但不是
在 Java 中,构造函数看起来像一个方法,但实际上并非如此。
为什么?是什么让构造函数不是方法?
非常简单,因为您不希望他们与您谈论差异:JAVA 已经决定了,这就是为什么在其文档中它总是谈论构造函数或方法。
此外,通过勾画定义(不可避免地基于差异),正如其名称所暗示的那样,构造函数具有构造类的实例的能力。一个方法不会构建,它不会创建,它只遵循给它的顺序。
Java 文档总是有所作为:
还:
这是一篇有趣的文章(英文)。
例如,它说,除其他外,在同一个类中,您可以有一个构造函数(它总是带有类的名称)和一个具有相同名称的方法......两者的工作方式不同,每个人都做存在的功能。
简而言之,构造函数看起来像一个方法,但它只是一个构造函数,因为 JAVA 希望它是。:)
一些有启发性的区别:
构造函数和方法的重要区别在于构造函数创建和初始化尚不存在的对象,而方法对已存在的对象执行操作。
不能直接调用构造函数。
new
当关键字创建对象时,它们被隐式调用。可以直接在已经用 . 创建的对象上调用方法new
。构造函数和方法定义在代码中看起来很相似。它们可以接受参数,可以有修饰符(例如,public),并且它们有方法体。
构造函数的名称必须与类名相同。他们不能返回任何东西,甚至不能返回 void(对象本身就是隐式返回)。
方法必须声明为返回某些内容,并且当它们不返回任何内容时,必须使用
void
.不
Java 中的构造函数不是方法,也不是特殊方法。它看起来像一个没有 Result 的方法,但它不是一个方法。
Java 语言规范是Java 语言参考文档。
我们可以在8.1.6 中阅读。类主体和成员声明
我们可以在8.8 中阅读。构造函数声明
如果构造函数是一个方法,那么构造函数就是一个成员。JLS 明确说不,构造函数不是成员,所以它不能是方法。
是和否
在西班牙语中的方法一词的意义上,构造函数是。
从技术和形式上讲,它不是,至少在 Java 中不是。
解释(尤其是对 OOP 新手)什么是构造函数,将其与方法进行比较是很常见的。我觉得它完全有效,过于教条化是徒劳的。但是,如果我这样解释,我还必须提到有重要的区别:
static
或final
(这没有意义)。new
返回相关类的新实例的关键字显式使用,或者在super(...)
构造函数中调用超类的构造函数。除此之外,它与方法有许多共同之处
private
性。protected
public
简而言之: 将构造函数视为一种方法(意识到它不是)不会使工程师的理智处于危险之中,同时不会忘记如上所述存在重要差异的意识。
教条地坚持“这不是一种方法”而不提及差异的重要性,就像告诉孩子“圣诞节的老人是谎言,邮递员带来了礼物”一样有用和具有教育意义。
为了不引发毫无意义的辩论,我想根据官方文档描述的内容来回答。
构造函数类似于方法,但由于提到的差异而不相同。
例如,Car类有一个构造函数:
Automovil
为了创建一个新的命名对象miAutomovil
,new 操作符调用了一个构造函数:new Automovil(30, 0, 8)
为对象创建内存空间并初始化其字段。虽然
Automovil
它只有一个构造函数,但它可以有其他构造函数,包括无参数构造函数:Automovil miAutomovil = new Automovil();
调用不带参数的构造函数来创建一个Automovil
名为的新对象miAutomovil
。Java中的构造函数是一种特殊类型的方法,它与类名匹配并且没有返回类型,当写new关键字时,Java会在内存中预留空间来存储对象,它还负责寻找构造函数,构造函数常用于初始化Class的实例变量
PS:它们是方法,因为它们接收参数并且在它们的主体中具有逻辑,但是它们是一种特殊类型的方法,只有在使用 new 关键字时才能访问
来源:Oracle Java Certified Associate (JAVA OCA 8)。