原文: https://www.programiz.com/java-programming/constructors

在本教程中,您将在示例的帮助下了解 Java 构造器,如何创建和使用它们以及不同类型的构造器。

什么是构造器?

在 Java 中,每个类都有其构造器,该构造器在创建该类的对象时会自动调用。 构造器类似于方法,但实际上,它不是方法。

Java 方法和 Java 构造器可以通过名称和返回类型来区分。 构造器与类具有相同的名称,并且不返回任何值。 例如,

  1. class Test {
  2. Test() {
  3. // constructor body
  4. }
  5. }

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

  1. class Test {
  2. void Test() {
  3. // method body
  4. }
  5. }

在此,Test()与该类具有相同的名称。 但是,它具有返回类型void。 因此,它是一种方法,而不是构造器。

推荐阅读构造器为什么不返回值


示例:Java 构造器

  1. class Main {
  2. private int x;
  3. // constructor
  4. private Main(){
  5. System.out.println("Constructor Called");
  6. x = 5;
  7. }
  8. public static void main(String[] args){
  9. // constructor is called while creating object
  10. Main obj = new Main();
  11. System.out.println("Value of x = " + obj.x);
  12. }
  13. }

输出

  1. Constructor Called
  2. Value of x = 5

在上面的示例中,我们有一个名为Main()private构造器。 在main方法内部,我们正在创建一个名为obj的对象。

  1. Main obj = new Main();

在此过程中,将调用构造器。 因此,将执行打印语句,并初始化变量x


构造器的类型

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

  • 无参构造器
  • 默认构造器
  • 参数化构造器

无参构造器

Java 构造器可以具有或可以不具有任何参数(参数)。 如果构造器不接受任何参数,则称为无参数构造器。 例如,

  1. private Constructor() {
  2. // body of constructor
  3. }

无参数构造器的示例

  1. class Main {
  2. int i;
  3. // constructor with no parameter
  4. private Main(){
  5. i = 5;
  6. System.out.println("Object created and i = " + i);
  7. }
  8. public static void main(String[] args) {
  9. // calling the constructor without any parameter
  10. Main obj = new Main();
  11. }
  12. }

输出

  1. Object created and i = 5

此处,构造器Main()不接受任何参数。

您是否注意到Main()构造器的访问修饰符是私有的?

这是因为该对象是从同一类中实例化的。 因此,它可以访问构造器。

但是,如果对象是在类外部创建的,则必须声明构造器public才能访问它。 例如:

  1. class Company {
  2. String domainName;
  3. // public constructor
  4. public Company(){
  5. domainName = "programiz.com";
  6. }
  7. }
  8. public class Main {
  9. public static void main(String[] args) {
  10. // object is created in another class
  11. Company companyObj = new Company();
  12. System.out.println("Domain name = "+ companyObj.domainName);
  13. }
  14. }

输出

  1. Domain name = programiz.com

推荐阅读Java 访问修饰符


默认构造器

如果不创建任何构造器,则 Java 编译器将在运行时自动创建无参数的构造器。 该构造器称为默认构造器。 默认构造器使用默认值初始化所有未初始化的实例变量。

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

示例:默认构造器

  1. class DefaultConstructor {
  2. int a;
  3. boolean b;
  4. public static void main(String[] args) {
  5. // A default constructor is called
  6. DefaultConstructor obj = new DefaultConstructor();
  7. System.out.println("a = " + obj.a);
  8. System.out.println("b = " + obj.b);
  9. }
  10. }

输出

  1. a = 0
  2. b = false

在上面的程序中,我们尚未初始化两个变量ab的值。 但是,当我们创建类的对象时,我们可以在输出中看到这些值已使用某些值进行了初始化。

这是因为 Java 编译器已自动创建了默认构造器。 构造器将使用默认值0false初始化变量ab的值。

上面的程序等效于:

  1. class DefaultConstructor {
  2. int a;
  3. boolean b;
  4. // a private constructor
  5. private DefaultConstructor() {
  6. a = 0;
  7. b = false;
  8. }
  9. public static void main(String[] args) {
  10. // call the constructor
  11. DefaultConstructor obj = new DefaultConstructor();
  12. System.out.println("a = " + obj.a);
  13. System.out.println("b = " + obj.b);
  14. }
  15. }

输出

  1. a = 0
  2. b = false

参数化构造器

与方法类似,我们可以将参数传递给构造器。 此类构造器称为参数化构造器。 例如,

  1. private Constructor (arg1, arg2, ..., argn) {
  2. // constructor body
  3. }

示例:参数化构造器

  1. class Vehicle {
  2. int wheels;
  3. // constructor accepting single value
  4. private Vehicle(int wheels){
  5. this.wheels = wheels;
  6. System.out.println(wheels + " wheeler vehicle created.");
  7. }
  8. public static void main(String[] args) {
  9. // calling the constructor by passing single value
  10. Vehicle v1 = new Vehicle(2);
  11. Vehicle v2 = new Vehicle(3);
  12. Vehicle v3 = new Vehicle(4);
  13. }
  14. }

输出

  1. 2 wheeler vehicle created.
  2. 3 wheeler vehicle created.
  3. 4 wheeler vehicle created.

在上面的示例中,我们有一个名为Vehicle()的构造器。 构造器接受一个名为wheel的参数。

在这里,在创建对象时,我们将参数传递给构造器。 并且,基于该参数,它正在生成输出。


Java 中的构造器重载

与方法重载类似,我们也可以重载 Java 中的构造器。 如果您不熟悉方法重载,请访问 Java 方法重载

在构造器重载中,有两个或多个具有不同参数的构造器。 例如,

  1. class Company {
  2. String domainName;
  3. // constructor with no parameter
  4. public Company(){
  5. this.domainName = "default";
  6. }
  7. // constructor with single parameter
  8. public Company(String domainName){
  9. this.domainName = domainName;
  10. }
  11. public void getName(){
  12. System.out.println(this.domainName);
  13. }
  14. public static void main(String[] args) {
  15. // calling the constructor with no parameter
  16. Company defaultObj = new Company();
  17. // calling the constructor with single parameter
  18. Company programizObj = new Company("programiz.com");
  19. defaultObj.getName();
  20. programizObj.getName();
  21. }
  22. }

输出

  1. default
  2. programiz.com

在上面的示例中,我们有两个构造器:public Company()和public Company(String domainName)

在这里,两个构造器都使用不同的值初始化变量domainName。 因此,基于所需的值,我们可以从main()方法中调用构造器。

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


重要笔记

  • 实例化对象时,将隐式调用构造器。
  • 创建构造器的两个规则是:

    • 构造器的名称应与类的名称相同。
    • Java 构造器不得具有返回类型。
  • 如果类没有构造器,则 Java 编译器会在运行时自动创建默认构造器。 默认构造器使用默认值初始化实例变量。 例如,int变量将被初始化为0
  • 构造器类型:

    • 无参构造器 - 不接受任何参数的构造器
    • 默认构造器 - 由 Java 编译器自动创建的构造器(如果未明确定义)。
    • 参数化构造器 - 接受参数的构造器
  • 构造器不能是抽象的,静态的或最终的。
  • 构造器可以重载,但不能被覆盖。