Java构造方法的基本定义
构造方法是Java类中一种特殊的方法,它的方法名和类名完全相同,没有返回值类型,甚至连void都不能写。当使用new关键字创建类的对象时,JVM会自动调用对应的构造方法完成对象的初始化工作。如果没有手动定义构造方法,Java编译器会自动生成一个无参数的默认构造方法,一旦手动定义了构造方法,默认的无参构造方法就不会再自动生成。

构造方法传递参数的基本用法
构造方法可以像普通方法一样定义参数,在创建对象时传入对应的参数值,就可以在构造方法内部用这些参数初始化对象的实例变量。下面是一个简单的示例,演示如何通过构造方法传递参数初始化用户对象。
public class User {
private String name;
private int age;
// 带参数的构造方法
public User(String name, int age) {
this.name = name;
this.age = age;
}
// 打印用户信息的方法
public void printInfo() {
System.out.println("用户名:" + name + ",年龄:" + age);
}
public static void main(String[] args) {
// 创建对象时传递参数
User user = new User("张三", 25);
user.printInfo();
}
}
上面的代码中,User类定义了一个带两个参数的构造方法,创建User对象时传入的"张三"和25会分别赋值给构造方法的name和age参数,再通过this关键字赋值给实例变量,完成对象的初始化。
构造方法传递引用类型参数
构造方法不仅可以传递基本数据类型参数,也可以传递引用类型参数。传递引用类型参数时,构造方法接收的是参数的引用地址,需要注意如果参数对象是可变对象,修改构造方法内的参数对象可能会影响原对象。
import java.util.Date;
public class Order {
private String orderId;
private Date createTime;
public Order(String orderId, Date createTime) {
this.orderId = orderId;
// 这里直接赋值引用,后续修改createTime会影响原对象
this.createTime = createTime;
}
public void printOrder() {
System.out.println("订单号:" + orderId + ",创建时间:" + createTime);
}
public static void main(String[] args) {
Date date = new Date();
Order order = new Order("ORD001", date);
order.printOrder();
// 修改原date对象
date.setTime(date.getTime() + 86400000);
// 订单的时间也会被修改
order.printOrder();
}
}
如果希望避免这种影响,可以在构造方法内对引用类型参数做拷贝处理,比如上面的例子中可以新建一个Date对象赋值给实例变量。
OOP构造方法使用技巧
构造方法重载
同一个类中可以定义多个参数列表不同的构造方法,这就是构造方法重载,方便在不同场景下创建对象。比如可以定义一个无参构造方法用于默认初始化,再定义带部分参数、全部参数的构造方法满足不同需求。
public class Product {
private String name;
private double price;
private int stock;
// 无参构造方法
public Product() {
this.name = "默认商品";
this.price = 0.0;
this.stock = 0;
}
// 带商品名和价格的构造方法
public Product(String name, double price) {
this.name = name;
this.price = price;
this.stock = 0;
}
// 带全部参数的构造方法
public Product(String name, double price, int stock) {
this.name = name;
this.price = price;
this.stock = stock;
}
public void printProduct() {
System.out.println("商品名:" + name + ",价格:" + price + ",库存:" + stock);
}
}
使用this调用其他构造方法
在一个构造方法中可以使用this(参数列表)的语法调用同一个类的其他构造方法,这样可以减少重复代码。需要注意this调用构造方法的语句必须放在构造方法的第一行。
public class Student {
private String studentId;
private String name;
private int grade;
public Student(String studentId, String name) {
// 调用三个参数的构造方法,默认年级为1
this(studentId, name, 1);
}
public Student(String studentId, String name, int grade) {
this.studentId = studentId;
this.name = name;
this.grade = grade;
}
public void printStudent() {
System.out.println("学号:" + studentId + ",姓名:" + name + ",年级:" + grade);
}
}
构造方法参数校验
在构造方法中可以对传入的参数做合法性校验,避免创建出状态不合法的对象。比如年龄不能为负数、库存不能为负数等,如果参数不合法可以直接抛出非法参数异常。
public class Employee {
private String name;
private int age;
private double salary;
public Employee(String name, int age, double salary) {
if (age < 18 || age > 60) {
throw new IllegalArgumentException("员工年龄必须在18到60之间");
}
if (salary < 0) {
throw new IllegalArgumentException("员工薪资不能为负数");
}
this.name = name;
this.age = age;
this.salary = salary;
}
public void printEmployee() {
System.out.println("员工姓名:" + name + ",年龄:" + age + ",薪资:" + salary);
}
}
避免构造方法做过多业务逻辑
构造方法的核心作用是初始化对象状态,不建议在构造方法中写过多的业务逻辑,比如复杂的计算、远程调用、IO操作等。过多的业务逻辑会让构造方法变得臃肿,也会增加对象创建的成本,还可能导致对象创建失败。如果有复杂的初始化逻辑,可以单独定义初始化方法,在对象创建后调用。