Java 构造方法

Java 中的构造方法类似于方法,是创建类的对象时调用的方法。在本教程中,我们通过示例了解 Java 构造方法、它们的类型以及如何使用它们。

在本教程中,我们通过示例了解 Java 构造方法、它们的类型以及如何使用它们。

什么是构造方法?

Java 中的构造方法类似于方法,是创建类的对象时调用的方法。

Java 方法不同,构造方法的名称与类的名称相同,并且没有任何返回类型。例如,

class Test {
  Test() {
    // 构造方法 body
  }
}

在这里, Test() 是一个构造方法。它与类的名称相同,并且没有返回类型。

示例 1:Java 构造方法

public class Main {
  private String name;

  // 构造方法
  Main() {
    System.out.println("调用了构造方法:");
    name = "GoBeta.NET";
  }

  public static void main(String[] args) {

    // 构造方法在创建对象时调用
    Main obj = new Main();
    System.out.println("对象的 name 是" + obj.name);
  }
}

输出

调用了构造方法:
对象的 name 是:GoBeta.NET

在上面的例子中,我们创建了一个名为 Main() 的构造方法。在构造方法内部,我们初始化了 name 字段。

构造方法类型

在 Java 中,构造方法可以分为 3 种类型:

  1. 无参数的构造方法
  2. 带参数的构造方法
  3. 默认构造方法

无参数的构造方法

与方法类似,构造方法可能有参数也可能没有参数。如果构造方法不接受任何参数,则称为无参数构造方法。例如:

private Constructor() {
  // body of the constructor
}

示例 2:Java 私有无参数构造方法

public class Main {

  int i;

  // 无参数构造方法
  private Main() {
    i = 5;
    System.out.println("调用了构造方法。");
  }

  public static void main(String[] args) {

    Main obj = new Main();
    System.out.println("i = " + obj.i);
  }
}

输出

调用了构造方法。
i = 5

在上面的例子中,我们创建了一个构造方法 Main() 。在这里,构造方法不接受任何参数。因此,它被称为无参数构造方法。

请注意,我们已将构造方法声明为私有 private

一旦声明了 private 构造方法,就不能从类外部访问它。

在这里,我们在同一个类中创建对象。因此,程序能够访问构造方法。要了解更多信息,请访问Java 实现私有构造方法

但是,如果我们想在类之外创建对象,那么我们需要将构造方法声明为 public

示例 3:Java 公共无参数构造方法

class Company {
  String name;

  // public 构造方法
  public Company() {
    name = "GoBeta.NET";
  }
}

public class Main {
  public static void main(String[] args) {

    // 在另外的类中创建对象
    Company obj = new Company();
    System.out.println("name = " + obj.name);
  }
}

输出

name = GoBeta.NET

请跳转到 Java 访问修饰符章节了解更多信息。

Java 带参数的构造方法

Java 构造方法也可以接受一个或多个参数。这种构造方法被称为带参数的构造方法。

示例 4:带参数的构造方法

public class Main {

  String languages;

  // 构造方法接受一个参数
  Main(String lang) {
    languages = lang;
    System.out.println(languages + " 编程语言");
  }

  public static void main(String[] args) {

    Main obj1 = new Main("Java");
    Main obj2 = new Main("Python");
    Main obj3 = new Main("C");
  }
}

输出

Java 编程语言
Python 编程语言
C 编程语言

在上面的例子中,我们创建了一个名为 Main() 的构造方法。在这里,构造方法接受一个参数。注意下面这行代码:

Main obj1 = new Main("Java");

在这里,我们将单个值传递给构造方法。根据传递的参数,在构造方法中初始化 languages 变量。

Java 默认构造方法

如果我们不创建任何构造方法,Java 编译器会在程序执行过程中自动创建一个无参数的构造方法。这个构造方法称为默认构造方法。

示例 5:默认构造方法

public class Main {

  int a;
  boolean b;

  public static void main(String[] args) {

    // 调用了默认构造方法。
    Main obj = new Main();

    System.out.println("Default Value:");
    System.out.println("a = " + obj.a);
    System.out.println("b = " + obj.b);
  }
}

输出

Default Value:
a = 0
b = false

本例中,我们没有创建任何构造方法。因此,Java 编译器会自动创建默认构造方法。

默认构造方法使用默认值初始化任何未初始化的实例变量。

类型 默认值
boolean false
byte 0
short 0
int 0
long 0L
char \u0000
float 0.0f
double 0.0d
object null

在上面的程序中,变量 ab 分别用默认值 0 和初始化 false

上述程序等价于:

public class Main {

  int a;
  boolean b;

  // 私有构造方法
  private Main() {
    a = 0;
    b = false;
  }

  public static void main(String[] args) {
    // 调用构造方法
    Main obj = new Main();

    System.out.println("Default Value:");
    System.out.println("a = " + obj.a);
    System.out.println("b = " + obj.b);
  }
}

程序的输出与示例 5 相同。

Java 构造方法的重要说明

  • 实例化对象时调用构造方法。
  • 创建构造方法的两条规则是:
    • 构造方法的名称应该与类相同。
    • Java 构造方法不能有返回类型。
  • 如果一个类没有构造方法,Java 编译器会在运行时自动创建一个默认构造方法。默认构造方法使用默认值初始化实例变量。例如, int 变量将被初始化为 0
  • 构造方法类型:
    • 无参数的构造方法
    • 带参数的构造方法
    • 默认构造方法
  • 构造方法不能是 abstractstaticfinal
  • 构造方法可以重载但不能被覆盖。

Java 中的构造方法重载

Java 方法重载类似,我们也可以创建两个或多个具有不同参数的构造方法。这称为构造方法重载。

示例 6:Java 构造方法重载

public class Main {

  String language;

  // 无参数的构造方法
  Main() {
    this.language = "Java";
  }

  // 带 langulage 参数的构造方法
  Main(String language) {
    this.language = language;
  }

  public void getName() {
    System.out.println("编程语言:" + this.language);
  }

  public static void main(String[] args) {

    // 调用无参数的构造方法
    Main obj1 = new Main();

    // 调用带 langulage 参数的构造方法
    Main obj2 = new Main("Python");

    obj1.getName();
    obj2.getName();
  }
}

输出

编程语言:Java
编程语言:Python

在上面的例子中,我们有两个构造方法: Main()Main(String language) 。这里,两个构造方法都用不同的值初始化变量语言的值。

注意:我们使用 this 关键字来指定类的变量。要了解有关 this 关键字的更多信息,请访问Java this 关键字

其他

一般情况下,构造函数都是 public 公有的,目的是在其他类中能够实例化该类。但是有时候我们可以将构造函数设置为 private 私有的,目的则是为了不让在类外部实例化此类的对象,比如常见的设计模式:单例模式。想了解关于更多信息,请跳转到 Java 单例章节。