Java 构造方法
一、什么是构造方法
构造方法是专门用来创建对象、初始化对象成员变量的特殊方法。
执行时机:执行 new 类名() 时,JVM 自动调用,只在创建对象时执行一次。
二、构造方法硬性特征(必背)
- 方法名必须和类名完全一致(大小写都要相同)
- 没有返回值,连
void都不能写 - 不能手动调用,只能
new对象时自动触发 - 可以重载(多个构造方法,参数列表不同)
错误示范
// 错误1:加了void
public void Person(){}
// 错误2:方法名和类名不一样
public void per(){}
三、两种构造方法
1. 默认无参构造(隐式构造)
- 如果你一个构造方法都不写,编译器会自动生成一个:
public Person(){
}
- 一旦你手写了有参构造,编译器不再提供默认无参构造,此时再写
new Person()会直接报错。
示例:
public class Person {
String name;
// 只写了有参构造
public Person(String n){
name = n;
}
}
// 测试
Person p1 = new Person("张三"); // 正常
Person p2 = new Person(); // 编译报错,找不到无参构造
2. 显式构造(自己写)
分为无参构造、有参构造,支持重载。
public class Student {
String name;
int age;
// 无参构造
public Student(){
System.out.println("无参构造执行");
}
// 单参构造
public Student(String n){
name = n;
}
// 双参构造
public Student(String n, int a){
name = n;
age = a;
}
}
四、this() 在构造方法中互相调用
this(参数) 表示调用本类其他构造方法,有两条强制规则:
- 必须写在构造方法第一行
- 不能互相循环调用(死递归,编译报错)
public class Student {
String name;
int age;
// 无参构造调用双参构造
public Student(){
this("默认姓名", 18); // 第一行
}
public Student(String name, int age){
this.name = name;
this.age = age;
}
}
五、构造方法作用
- 创建对象时给成员变量赋初始值,简化代码
- 强制创建对象时必须传入某些参数(比如用户必须有姓名)
- 统一对象初始化逻辑(多个构造通过
this()复用代码)
六、构造方法 vs 普通成员方法
| 对比项 | 构造方法 | 普通成员方法 |
|---|---|---|
| 方法名 | 和类名相同 | 自定义名称 |
| 返回值 | 无,不能写void | 必须有返回值/void |
| 调用时机 | new 对象时自动执行 | 对象.方法()手动调用 |
| 执行次数 | 一个对象只执行1次 | 可调用任意次 |
| this调用 | 可用this()调用其他构造 | 不能用this() |
七、完整实操案例
public class Dog {
// 成员变量
private String dogName;
private String color;
// 无参构造
public Dog() {
this("小黑", "黑色"); // 调用双参构造
}
// 有参构造1
public Dog(String dogName) {
this(dogName, "灰色");
}
// 有参构造2(核心初始化)
public Dog(String dogName, String color) {
this.dogName = dogName;
this.color = color;
}
// 输出信息
public void show() {
System.out.println("名字:" + dogName + ",颜色:" + color);
}
}
class TestDog {
public static void main(String[] args) {
Dog d1 = new Dog();
d1.show(); // 名字:小黑,颜色:黑色
Dog d2 = new Dog("旺财");
d2.show(); // 名字:旺财,颜色:灰色
Dog d3 = new Dog("柯基", "黄白");
d3.show(); // 名字:柯基,颜色:黄白
}
}
八、常见考点总结
- 没写任何构造 → 编译器自动提供公共无参构造
- 写了有参构造 → 无参构造消失,需要手动补充
this()只能在构造第一行,不能和普通方法混用- 构造方法不能被
static/final/abstract修饰 - 构造方法不能有返回值,区别普通方法
浙公网安备 33010602011771号