Java 中的构造函数

2025年4月28日 | 阅读 8 分钟

Java中的构造函数是一段与方法类似的由代码组成的块。当类的实例被创建时,它会被调用。在调用构造函数时,内存会被分配给对象。它是一种特殊类型的方法,用于初始化对象。

每次使用new关键字创建对象时,它都会调用一个默认构造函数。如果类中没有可用的构造函数。在这种情况下,Java编译器会自动提供一个默认构造函数。

Java中有两种构造函数:无参构造函数带参构造函数

注意:之所以称为构造函数,是因为它在对象创建时构造值。一个类不一定要写构造函数。因为如果你的类没有任何构造函数,Java编译器会创建一个默认构造函数。

创建Java构造函数的规则

定义构造函数有以下规则:

  1. 构造函数的名称必须与其类名相同。
  2. 构造函数不得有显式的返回类型。
  3. Java构造函数不能是抽象的、静态的、最终的或同步的。

注意:我们可以在声明构造函数时使用访问修饰符。它控制对象的创建。构造函数可以是私有的、受保护的、公共的或默认的。

Java构造函数类型

Java 中有两种构造函数:

  1. 默认构造函数(无参构造函数)
  2. 参数化构造函数
Java Constructors

1) Java默认构造函数

不带任何参数的构造函数称为默认构造函数。

语法

默认构造函数示例

在此示例中,我们在Bike类中创建了一个无参构造函数。它将在对象创建时调用。

示例

编译并运行

输出

Bike is created

规则:如果一个类中没有构造函数,编译器会自动创建一个默认构造函数。

Java default constructor

问:默认构造函数的目的是什么?

默认构造函数用于为对象提供默认值,例如0、null等,具体取决于类型。

默认构造函数示例:显示默认值

示例

编译并运行

输出

0 null
0 null

解释:在上面的类中,我们没有创建任何构造函数,所以编译器为我们提供了一个默认构造函数。这里,0和null值由默认构造函数提供。

2) Java带参构造函数

具有特定数量参数的构造函数称为带参构造函数。

为什么使用带参构造函数?

带参构造函数用于为不同的对象提供不同的值。当然,您也可以提供相同的值。

带参构造函数示例

在此示例中,我们创建了具有两个参数的Student类的构造函数。构造函数可以有任意数量的参数。

示例

编译并运行

输出

111 Joseph
222 Sonoo

Java中的构造函数重载

在Java中,构造函数就像一个没有返回类型的方法。它也可以像Java方法一样被重载。

Java中的构造函数重载是一种拥有多个具有不同参数列表的构造函数的技术。它们排列的方式使得每个构造函数执行不同的任务。编译器根据参数列表的数量和类型来区分它们。

构造函数重载示例

示例

编译并运行

输出

111 Karan 0
222 Aryan 25

Java中构造函数与方法的区别

构造函数和方法之间有很多区别。如下所示:

Java构造函数Java方法
构造函数用于初始化对象的状态。方法用于暴露对象的行为。
构造函数不得有返回类型。方法必须有返回类型。
构造函数是隐式调用的。方法是显式调用的。
如果我们在一类中没有构造函数,Java编译器会提供一个默认构造函数。在任何情况下,编译器都不会提供方法。
构造函数的名称必须与类名相同。方法名可以与类名相同,也可以不相同。

Java复制构造函数

Java不支持复制构造函数。但是,我们可以像C++中的复制构造函数一样,将值从一个对象复制到另一个对象。

将一个对象的值复制到另一个对象有以下三种方法:

  • 通过构造函数
  • 通过将一个对象的值赋给另一个对象
  • 通过使用Object类的clone()方法

在此示例中,我们将使用Java构造函数将一个对象的值复制到另一个对象。

Java复制构造函数示例

示例

编译并运行

输出

111 Karan
111 Karan

不带构造函数复制值

我们可以通过将一个对象的实例变量赋值给另一个对象来复制其值。在这种情况下,无需创建构造函数。

示例

编译并运行

输出

111 Karan
111 Karan

构造方法链

Java中的构造函数链是一种实践,其中一个构造函数在对象创建时调用同一类或超类的另一个构造函数。通常使用this()调用同一类中的另一个构造函数,或使用super()调用超类中的构造函数。通过集中常见的构造逻辑,构造函数链有助于减少代码冗余并提高代码的可读性。

要了解更多,请阅读Java中的构造函数链

如果您是Java初学者,最好跳过这部分,因为我们稍后将学习this和super关键字。

要记住的重要事项

  1. 当使用new关键字创建对象时,构造函数会自动被调用。
  2. 如果未定义构造函数,Java会提供一个默认构造函数,该构造函数将实例变量初始化为默认值(0、null等)。
  3. 构造函数没有返回类型,甚至没有void。
  4. 构造函数的名称必须与类名完全匹配。
  5. 允许构造函数重载,这意味着可以定义具有不同参数的多个构造函数。
  6. 构造函数可以使用this()调用同一类中的另一个构造函数,这被称为构造函数链。
  7. 构造函数可以使用super()调用超类构造函数,它必须是构造函数中的第一条语句。
  8. 在Java中,构造函数不能是静态的、最终的、抽象的或同步的。
  9. 构造函数可以具有访问修饰符(public、private、protected或default)。私有构造函数用于单例模式。
  10. 构造函数可以执行初始化以外的其他任务,例如打开数据库连接、启动线程或调用方法。

问:构造函数是否返回任何值?

是的,它是当前类的实例(我们不能使用return类型,但它仍然返回一个值)。

问:构造函数是否可以执行初始化以外的其他任务?

是的,例如对象创建、启动线程、调用方法等。我们可以在构造函数中执行任何操作,就像在方法中执行一样。

问:Java中是否存在Constructor类?

是。

问:Constructor类的目的是什么?

Java提供了一个Constructor类,可用于获取类中构造函数的内部信息。它属于java.lang.reflect包。


Java构造函数选择题

1. 如果在Java中为类定义了不同访问修饰符的构造函数,会发生什么?

  1. 会导致编译时错误。
  2. 类继承了构造函数的访问修饰符。
  3. 构造函数可以具有任何访问修饰符,而与类的访问修饰符无关。
  4. 类的访问修饰符必须与构造函数匹配。
 

答案:c)

解释:构造函数可以具有任何访问修饰符,而与类的访问修饰符无关。这允许在不同上下文中控制类的实例化。


2. 构造函数可以在Java中是抽象的吗?

  1. 是的
  2. 不能
  3. 只有当类也是抽象类时
  4. 仅在嵌套类中
 

答案:b)

解释:Java中的构造函数不能是抽象的。它们用于实例化对象,而抽象方法没有要执行的函数体,因此与构造函数的性质不兼容。


3. Java中复制构造函数的主要目的是什么?

  1. 创建对象的深拷贝。
  2. 用现有对象的值初始化新创建的对象。
  3. 覆盖默认构造函数。
  4. 处理资源清理。
 

答案:b)

解释:复制构造函数使用现有对象的值初始化新对象。这对于创建具有相同状态的副本非常有用。


4. 关于Java中的构造函数链,以下哪项是正确的?

  1. 它允许构造函数使用this和super关键字相互调用。
  2. 它用于在类中定义多个构造函数。
  3. 它是一种防止对象创建的技术。
  4. 它要求所有构造函数具有相同数量的参数。
 

答案:a)

解释:构造函数链允许一个构造函数使用this调用同一类中的另一个构造函数,或使用super调用超类构造函数。它有助于重用构造函数代码并维护简洁高效的初始化过程。


5. 在Java中,如果未指定其他构造函数调用,编译器会在每个构造函数中隐式插入什么调用?

  1. this()
  2. super()
  3. default()
  4. base()
 

答案:b)

解释:如果未显式调用构造函数,编译器会在每个构造函数中隐式插入一个对super()的调用。它确保调用了超类构造函数,初始化了对象超类部分。