Java 构造方法
构造方法是创建对象时自动调用的特殊方法,用于初始化对象的状态。理解构造方法的使用、重载和链式调用,是掌握对象创建的关键。本章将详细介绍 Java 构造方法的各个方面。
默认构造方法
什么是默认构造方法
默认构造方法是 Java 自动提供的无参构造方法,如果没有显式定义构造方法,编译器会自动添加。
public class Student {
private String name;
private int age;
// 没有定义构造方法
// Java 自动提供:public Student() { }
}
// 可以使用默认构造方法
Student student = new Student();
默认构造方法的特点
- 无参数:不接受任何参数
- 无方法体:方法体为空
- 公共访问:如果类是 public,构造方法也是 public
- 自动提供:只有在没有定义任何构造方法时才提供
失去默认构造方法
一旦定义了构造方法,默认构造方法就不再自动提供:
public class Student {
private String name;
// 定义了有参构造方法
public Student(String name) {
this.name = name;
}
// 此时没有默认构造方法
// Student student = new Student(); // ❌ 编译错误
}
// 如果需要无参构造,需要显式定义
public class Student {
private String name;
// 有参构造
public Student(String name) {
this.name = name;
}
// 显式定义无参构造
public Student() {
this.name = "未知";
}
}
带参构造方法
定义带参构造方法
带参构造方法可以接收参数来初始化对象。
public class Student {
private String name;
private int age;
private String studentId;
// 带参构造方法
public Student(String name, int age, String studentId) {
this.name = name;
this.age = age;
this.studentId = studentId;
}
}
// 使用
Student student = new Student("张三", 20, "S001");
构造方法的参数验证
public class Student {
private String name;
private int age;
public Student(String name, int age) {
// 参数验证
if (name == null || name.trim().isEmpty()) {
throw new IllegalArgumentException("姓名不能为空");
}
if (age < 0 || age > 150) {
throw new IllegalArgumentException("年龄必须在 0-150 之间");
}
this.name = name;
this.age = age;
}
}
构造方法重载与链式调用
构造方法重载
构造方法重载:同一个类可以有多个构造方法,参数列表不同。
public class Student {
private String name;
private int age;
private String studentId;
private String email;
// 构造方法 1:无参
public Student() {
this("未知", 0, "N/A", "N/A");
}
// 构造方法 2:两个参数
public Student(String name, int age) {
this(name, age, "N/A", "N/A");
}
// 构造方法 3:三个参数
public Student(String name, int age, String studentId) {
this(name, age, studentId, "N/A");
}
// 构造方法 4:四个参数(主构造方法)
public Student(String name, int age, String studentId, String email) {
this.name = name;
this.age = age;
this.studentId = studentId;
this.email = email;
}
}
// 使用
Student s1 = new Student(); // 构造方法 1
Student s2 = new Student("张三", 20); // 构造方法 2
Student s3 = new Student("李四", 22, "S002"); // 构造方法 3
Student s4 = new Student("王五", 21, "S003", "wang@example.com"); // 构造方法 4
构造方法链式调用
使用 this() 调用其他构造方法,避免代码重复。
public class Student {
private String name;
private int age;
private String studentId;
private String email;
// 无参构造:调用两参构造
public Student() {
this("未知", 0);
}
// 两参构造:调用三参构造
public Student(String name, int age) {
this(name, age, "N/A");
}
// 三参构造:调用四参构造
public Student(String name, int age, String studentId) {
this(name, age, studentId, "N/A");
}
// 主构造方法:完成实际初始化
public Student(String name, int age, String studentId, String email) {
this.name = name;
this.age = age;
this.studentId = studentId;
this.email = email;
}
}