Skip to content

Java 构造方法

在 Java 中,构造方法 (Constructor) 是一种特殊类型的方法,它在创建类的新对象时被调用。它的主要目的是为对象的实例变量提供初始值。

构造方法的特点

  1. 名称与类名相同: 构造方法的名称必须与它所在的类的名称完全匹配。
  2. 没有返回类型: 构造方法没有返回类型,连 void 也没有。这是它与普通方法的一个关键区别。
  3. 自动调用: 当使用 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();
    }
}

通过重载构造方法,我们可以根据不同的初始信息,方便地创建出符合要求的对象。

本站内容仅供学习和研究使用。