Java 构造函数面试题

2025年3月30日 | 阅读 5 分钟

构造函数是 Java 程序的一个组成部分。它是核心 Java 的重要主题之一。因此,在每一次基于 Java 的面试中,面试官都有可能问几个关于 Java 构造函数的问题。

在本文中,我们将讨论一些关于构造函数的常见面试问题。

1) 定义构造函数?

Java 构造函数是一个特殊的初始化方法,它在创建类的实例时被调用。内存是在调用构造函数时为对象分配的。

基本上,构造函数是一段代码块。当我们使用 new() 关键字创建类的对象时,至少会调用一个构造函数,它会初始化对象并为其分配内存。

如果我们没有指定任何构造函数,它将调用类的默认构造函数。但是,由于 Java 编译器为每个 Java 类提供了一个默认构造函数,因此并非必须显式指定构造函数。


2) Java 中有多少种构造函数?

Java 中有两种构造函数:

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

默认构造函数的语法如下:

示例

带参构造函数的语法如下:

示例


3) Java 中有拷贝构造函数吗?

与 C++ 不同,Java 中没有显式的拷贝构造函数。但是,我们可以通过将一个对象的值复制到另一个对象来实现 Java 中的拷贝构造函数功能,就像拷贝构造函数一样。

以下是一些将值从一个对象复制到另一个对象的方法:

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

4) 编写一个 Java 程序将值从一个对象复制到另一个对象。

下面的 Java 程序将值从一个对象复制到另一个对象。

ConstructorDemo.java

输出

100 Joy
100 Joy

在上面的示例中,我们创建了 ConstructorDemo 的两个实例,并将第一个对象的值传递给了第二个构造函数。这样,我们就可以在 Java 中使用拷贝构造函数了。


5) 有什么方法可以从父类构造函数调用子类构造函数吗?

子类构造函数有其私有的数据成员,因此 Java 不提供任何方法从父类构造函数访问子类构造函数。但是,我们可以使用 super 关键字从子类构造函数调用父类构造函数。


6) 接口中可以有构造函数吗?

不可以,Java 接口中不能有构造函数。


7) 解释构造函数链?

构造函数链是一种通过当前对象调用另一个构造函数的方式。可以通过以下两种方式实现:

从基类调用:我们可以使用 super 关键字从基类调用构造函数。

在同一类内:我们可以使用 this() 关键字在同一类内调用构造函数。

下面是一个构造函数链的例子:


8) 如果为构造函数提供返回类型会发生什么?

如果为构造函数提供返回类型,它将像一个普通方法一样工作。但是,编译器会显示一个警告消息,“此方法具有构造函数名称”。

考虑下面的示例

上面的程序将能顺利编译,但会显示以下警告消息:

Java Constructor Interview Questions

9) 什么是私有构造函数?

与方法一样,Java 中也可以有私有构造函数。要使构造函数成为私有的,请在使用 private 关键字声明它。它只能在该类内访问。

以下是一些需要私有构造函数的使用场景:

  • 内部构造函数链
  • 单例类设计模式

下面是一个私有构造函数的例子:

PrivateConstructor.java

输出

In a private constructor

10) 为什么 Java 中的构造函数不能是静态的?

Java 中的构造函数不能是静态的。当我们声明一个方法为静态时,意味着该方法属于类而不是特定对象。但是构造函数总是针对对象的引用调用的。所以,将构造函数声明为静态是没有意义的。


11) 构造函数可以被声明为 final 吗?

不可以,构造函数不能被声明为 final。如果将其声明为 final,则会引发编译时错误“修饰符 final 不允许”。


12) 构造函数可以被声明为抽象的吗?

它的主体,这实际上没有意义。它在对象创建时自动调用。所以,它不能是一个没有主体的块。


13) 当构造函数声明为 protected 时会发生什么?

通常,当我们声明一个方法为 protected 时,其他类可以通过继承在不同包中访问该方法。但是,当我们声明一个构造函数为 protected 时,它的行为与方法略有不同。根据 Java 语言标准,protected 构造函数只能通过 super 关键字访问。


14) 为什么构造函数名称与类名相似?

当我们使用 new 关键字创建类的对象时,它应该包含关于该特定类的信息。这就是为什么构造函数的名称必须与类名相似。


15) 为什么构造函数不允许有返回类型?

构造函数不允许有返回类型,因为如果我们为构造函数提供返回类型,它将充当普通方法。所以,为了区分构造函数和方法块,构造函数不允许有返回类型。