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