Java构造方法 #

一、构造方法概述 #

构造方法是一种特殊的方法,用于创建对象时初始化对象。

二、构造方法特点 #

2.1 基本特点 #

  • 方法名与类名相同
  • 没有返回值类型(不是void)
  • 创建对象时自动调用
  • 可以重载

2.2 基本语法 #

java
public class Person {
    private String name;
    private int age;
    
    // 构造方法
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

三、默认构造方法 #

3.1 自动提供 #

java
public class Person {
    private String name;
    private int age;
    
    // 如果没有定义构造方法,编译器自动提供无参构造
    // public Person() { }
}

// 使用默认构造创建对象
Person p = new Person();

3.2 定义后不再提供 #

java
public class Person {
    private String name;
    
    // 定义了有参构造
    public Person(String name) {
        this.name = name;
    }
    
    // 编译器不再提供默认无参构造
}

// Person p = new Person();  // 错误:没有无参构造
Person p = new Person("张三");  // 正确

3.3 建议显式定义 #

java
public class Person {
    private String name;
    
    // 建议同时提供无参和有参构造
    public Person() {
    }
    
    public Person(String name) {
        this.name = name;
    }
}

四、构造方法重载 #

4.1 多个构造方法 #

java
public class Person {
    private String name;
    private int age;
    private String address;
    
    // 无参构造
    public Person() {
    }
    
    // 一个参数
    public Person(String name) {
        this.name = name;
    }
    
    // 两个参数
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    // 三个参数
    public Person(String name, int age, String address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }
}

4.2 使用this调用其他构造 #

java
public class Person {
    private String name;
    private int age;
    private String address;
    
    // 无参构造
    public Person() {
        this("未知", 0, "未知");  // 调用三参构造
    }
    
    // 一个参数
    public Person(String name) {
        this(name, 0, "未知");  // 调用三参构造
    }
    
    // 两个参数
    public Person(String name, int age) {
        this(name, age, "未知");  // 调用三参构造
    }
    
    // 三个参数
    public Person(String name, int age, String address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }
}

4.3 this调用规则 #

java
public class Demo {
    private int a;
    private int b;
    
    public Demo() {
        this(0);  // this()必须在第一行
    }
    
    public Demo(int a) {
        this(a, 0);  // this()必须在第一行
    }
    
    public Demo(int a, int b) {
        this.a = a;
        this.b = b;
    }
}

五、私有构造方法 #

5.1 单例模式 #

java
public class Singleton {
    private static Singleton instance;
    
    // 私有构造方法:外部无法创建对象
    private Singleton() {
    }
    
    // 提供静态方法获取实例
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

5.2 工具类 #

java
public class MathUtils {
    // 私有构造方法:防止实例化
    private MathUtils() {
        throw new UnsupportedOperationException("工具类不能实例化");
    }
    
    public static int max(int a, int b) {
        return a > b ? a : b;
    }
}

六、构造方法与初始化顺序 #

6.1 初始化顺序 #

java
public class Demo {
    // 1. 静态变量
    private static int staticVar = initStaticVar();
    
    // 2. 实例变量
    private int instanceVar = initInstanceVar();
    
    // 3. 静态代码块
    static {
        System.out.println("静态代码块");
    }
    
    // 4. 实例代码块
    {
        System.out.println("实例代码块");
    }
    
    // 5. 构造方法
    public Demo() {
        System.out.println("构造方法");
    }
    
    private static int initStaticVar() {
        System.out.println("静态变量初始化");
        return 0;
    }
    
    private int initInstanceVar() {
        System.out.println("实例变量初始化");
        return 0;
    }
    
    public static void main(String[] args) {
        new Demo();
        // 输出顺序:
        // 静态变量初始化
        // 静态代码块
        // 实例变量初始化
        // 实例代码块
        // 构造方法
    }
}

6.2 继承中的初始化 #

java
public class Parent {
    static {
        System.out.println("父类静态代码块");
    }
    
    {
        System.out.println("父类实例代码块");
    }
    
    public Parent() {
        System.out.println("父类构造方法");
    }
}

public class Child extends Parent {
    static {
        System.out.println("子类静态代码块");
    }
    
    {
        System.out.println("子类实例代码块");
    }
    
    public Child() {
        System.out.println("子类构造方法");
    }
    
    public static void main(String[] args) {
        new Child();
        // 输出顺序:
        // 父类静态代码块
        // 子类静态代码块
        // 父类实例代码块
        // 父类构造方法
        // 子类实例代码块
        // 子类构造方法
    }
}

七、构造方法最佳实践 #

7.1 提供无参构造 #

java
public class Person {
    private String name;
    private int age;
    
    // 提供无参构造(框架需要)
    public Person() {
    }
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

7.2 使用链式调用 #

java
public class Person {
    private String name;
    private int age;
    
    public Person() {
    }
    
    public Person name(String name) {
        this.name = name;
        return this;
    }
    
    public Person age(int age) {
        this.age = age;
        return this;
    }
}

// 使用
Person p = new Person().name("张三").age(25);

7.3 参数校验 #

java
public class Person {
    private String name;
    private int age;
    
    public Person(String name, int age) {
        if (name == null || name.isEmpty()) {
            throw new IllegalArgumentException("姓名不能为空");
        }
        if (age < 0 || age > 150) {
            throw new IllegalArgumentException("年龄不合法");
        }
        this.name = name;
        this.age = age;
    }
}

7.4 使用Builder模式 #

java
public class Person {
    private final String name;
    private final int age;
    private final String address;
    
    private Person(Builder builder) {
        this.name = builder.name;
        this.age = builder.age;
        this.address = builder.address;
    }
    
    public static class Builder {
        private String name;
        private int age;
        private String address;
        
        public Builder name(String name) {
            this.name = name;
            return this;
        }
        
        public Builder age(int age) {
            this.age = age;
            return this;
        }
        
        public Builder address(String address) {
            this.address = address;
            return this;
        }
        
        public Person build() {
            return new Person(this);
        }
    }
}

// 使用
Person p = new Person.Builder()
    .name("张三")
    .age(25)
    .address("北京")
    .build();

八、总结 #

要点 说明
方法名 与类名相同
返回值 没有返回值类型
调用时机 创建对象时自动调用
默认构造 未定义时自动提供
重载 可以定义多个构造方法
this() 调用其他构造,必须在第一行

构造方法要点:

  • 方法名与类名相同
  • 没有返回值类型
  • 可以重载
  • this()调用其他构造必须在第一行
  • 建议提供无参构造
最后更新:2026-03-26