Java 构造方法
在 Java 中,构造方法 (Constructor) 是一种特殊类型的方法,它在创建类的新对象时被调用。它的主要目的是为对象的实例变量提供初始值。
构造方法的特点
- 名称与类名相同: 构造方法的名称必须与它所在的类的名称完全匹配。
- 没有返回类型: 构造方法没有返回类型,连
void也没有。这是它与普通方法的一个关键区别。 - 自动调用: 当使用
new关键字创建类的实例时,构造方法会被自动调用。
默认构造方法 (Default Constructor)
如果您在类中没有定义任何构造方法,Java 编译器会自动为您提供一个无参数的、方法体为空的默认构造方法。这个构造方法会将实例变量初始化为其默认值(数值为 0,布尔值为 false,引用类型为 null)。
java
public class Car {
String model;
int year;
// 这里没有定义任何构造方法,所以编译器会提供一个默认的 public Car() {}
}
public class Main {
public static void main(String[] args) {
Car myCar = new Car(); // 调用了默认构造方法
System.out.println("型号: " + myCar.model); // 输出: null
System.out.println("年份: " + myCar.year); // 输出: 0
}
}重要: 一旦您在类中定义了任何一个构造方法(无论有无参数),编译器就不会再为您提供默认构造方法了。
带参数的构造方法 (Parameterized Constructor)
通常,我们希望在创建对象时就能为其属性设置有意义的初始值。这可以通过定义带参数的构造方法来实现。
java
public class Dog {
String name;
int age;
// 这是一个带参数的构造方法
public Dog(String dogName, int dogAge) {
System.out.println("带参数的构造方法被调用了!");
// 使用 'this' 关键字来区分实例变量和局部参数
this.name = dogName;
this.age = dogAge;
}
public void displayInfo() {
System.out.println("名字: " + name + ", 年龄: " + age);
}
}
public class Main {
public static void main(String[] args) {
// 创建对象时必须提供匹配的参数
Dog myDog = new Dog("旺财", 3);
myDog.displayInfo(); // 输出: 名字: 旺财, 年龄: 3
// Dog anotherDog = new Dog(); // 这行会编译错误,因为默认构造方法不存在了
}
}this 关键字
在上面的例子中,this.name = dogName; 这一行:
this.name指的是当前正在创建的对象的实例变量name。dogName指的是传递给构造方法的局部参数dogName。
当参数名和实例变量名相同时,必须使用 this 关键字来消除歧义。这是一种非常常见的编码风格。
构造方法重载 (Constructor Overloading)
和普通方法一样,构造方法也可以被重载。这意味着一个类可以有多个构造方法,只要它们的参数列表不同(参数的数量、类型或顺序不同)。
这为创建对象提供了更大的灵活性。
java
public class Employee {
String name;
String department;
double salary;
// 构造方法 1: 只提供姓名,部门和薪水使用默认值
public Employee(String name) {
this.name = name;
this.department = "未分配";
this.salary = 3000.0;
}
// 构造方法 2: 提供姓名和部门
public Employee(String name, String department) {
this.name = name;
this.department = department;
this.salary = 3000.0;
}
// 构造方法 3: 提供所有信息
public Employee(String name, String department, double salary) {
this.name = name;
this.department = department;
this.salary = salary;
}
public void display() {
System.out.printf("姓名: %s, 部门: %s, 薪水: %.2f%n", name, department, salary);
}
}
public class Main {
public static void main(String[] args) {
Employee emp1 = new Employee("张三");
Employee emp2 = new Employee("李四", "技术部");
Employee emp3 = new Employee("王五", "市场部", 8000.0);
emp1.display();
emp2.display();
emp3.display();
}
}通过重载构造方法,我们可以根据不同的初始信息,方便地创建出符合要求的对象。