Skip to content

面试速答(先看这里)

**一句话结论:**不管有参还是无参,都是为了做对象的初始化的。

60秒标准回答:

Java中的构造函数分为无参和有参

不管有参还是无参,都是为了做对象的初始化的。无参的就是给对象的成员变量设置默认值。有参的就是根据我们的参数进行初始化

如果没有显示定义任何构造函数,会自动添加一个无参构造函数。但是如果已经定义过构造函数,那么就不会默认添加了

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**Java中的构造函数分为无参和有参。
  • **要点2:**如果没有显示定义任何构造函数,会自动添加一个无参构造函数。
  • **要点3:**定义一个无参构造函数(也称为默认构造器)通常被认为是Java编程中的一种好习惯,虽然如果我们没定义,JDK会帮我自动生成一个,但是如果我们自己定义了一个有参的构造函数,那么就不会自动帮我们生成无参构造函数了,而没有无参构造函数会带来一系列问题 :
  • **要点4:**在使用Java反射或者序列化/反序列化时,经常是调用类的无参构造函数进行对象创建的。
  • **要点5:**根据JavaBean规范,一个标准的JavaBean必须拥有一个公共的无参构造器。

**记忆锚点:**Java → JavaBean → 3 JavaBean规范 → Hibernate → 造器默认会调用父类 → 无参的就是给对象

加分表达:

  • 如果没有显示定义任何构造函数,会自动添加一个无参构造函数。
  • 但是如果已经定义过构造函数,那么就不会默认添加了。
  • 如果没有定义无参构造器,这些框架可能无法正常工作。

追问准备:

  • 围绕「Java」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「JavaBean」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「3 JavaBean规范」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

Java中的构造函数分为无参和有参。

plain
public class Person {
    private String name;
    private int age;

    // 无参构造器
    public Person() {
        this.name = "Unknown";
        this.age = 0;
    }

    // 有参构造器
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // ...其他方法...
}

不管有参还是无参,都是为了做对象的初始化的。无参的就是给对象的成员变量设置默认值。有参的就是根据我们的参数进行初始化。

如果没有显示定义任何构造函数,会自动添加一个无参构造函数。但是如果已经定义过构造函数,那么就不会默认添加了。

定义一个无参构造函数(也称为默认构造器)通常被认为是Java编程中的一种好习惯,虽然如果我们没定义,JDK会帮我自动生成一个,但是如果我们自己定义了一个有参的构造函数,那么就不会自动帮我们生成无参构造函数了,而没有无参构造函数会带来一系列问题:

1.反射及序列化要求

在使用Java反射或者序列化/反序列化时,经常是调用类的无参构造函数进行对象创建的。

2. 兼容性和可扩展性

许多Java框架和库,如Spring、Hibernate、Jackson等,在进行对象的创建和初始化时,依赖于类的无参构造器。如果没有定义无参构造器,这些框架可能无法正常工作。

3. JavaBean规范

根据JavaBean规范,一个标准的JavaBean必须拥有一个公共的无参构造器。这使得JavaBean可以被实例化,并且其属性可以通过反射机制被外部访问和修改。

4. 子类构造器的默认行为

在Java中,子类构造器默认会调用父类的无参构造器。如果父类没有定义无参构造器,而子类又没有显式调用父类的其他构造器,这将导致编译错误。