Java 中的构造函数

Java 中的构造函数是什么?

构造函数 - Constructor 是一种特殊方法,用于初始化新创建的对象,并在为对象分配内存后立即调用。它可用于在创建对象时将对象初始化为所需的值或默认值。用户可以不必为类编写构造函数。

如果没有为类提供用户定义的构造函数,则编译器会将成员变量初始化为其默认值。

  • 数字数据类型设置为 0
  • char 数据类型设置为空字符(\0
  • 引用变量设置为 null

在本教程中,你将学习 -

  • 什么是 Java 中的构造函数?
  • 创建构造函数的规则
  • 构造函数重载
  • 构造链接

创建 Java 构造函数的规则

  1. 它与类同名
  2. 它不应该返回一个值甚至是 void

示例 1:创建你的第一个 Java 构造函数

步骤 1: 在编辑器中输入以下代码。

class Demo{
      int  value1;
      int  value2;
      Demo(){
         value1 = 10;
         value2 = 20;
         System.out.println("Inside Constructor");
     }
 
     public void display(){
        System.out.println("Value1 === "+value1);
        System.out.println("Value2 === "+value2);
    }
 
   public static void main(String args[]){
       Demo d1 = new Demo();
      d1.display();
  }
}

步骤 2: 保存、运行和编译代码。观察输出。

输出:

Inside Constructor
Value1 === 10
Value2 === 20

构造函数重载

构造函数重载是 Java 中的一种技术,其中一个类可以包含任意数量的参数列表中不同的构造函数。编译器通过参考列表中的参数数量及其类型来区分这些构造函数。

Account 类的有效构造函数的示例是

Account(int a);
Account (int a,int b);
Account (String a,int b);

示例 2:了解构造函数重载

步骤 1: 在编辑器中输入下面的代码。

class Demo{
      int  value1;
      int  value2;
      /*Demo(){
       value1 = 10;
       value2 = 20;
       System.out.println("Inside 1st Constructor");
     }*/
     Demo(int a){
      value1 = a;
      System.out.println("Inside 2nd Constructor");
    }
    Demo(int a,int b){
    value1 = a;
    value2 = b;
    System.out.println("Inside 3rd Constructor");
   }
   public void display(){
      System.out.println("Value1 === "+value1);
      System.out.println("Value2 === "+value2);
  }
  public static void main(String args[]){
    Demo d1 = new Demo();
    Demo d2 = new Demo(30);
    Demo d3 = new Demo(30,40);
    d1.display();
    d2.display();
    d3.display();
 }
}

步骤 2: 保存、编译和运行代码。

步骤 3: 错误出现后,在继续下一步之前尝试并调试错误。

步骤 4: 每个类都有一个默认的构造函数。Demo 类的默认构造函数是 Demo()。如果你不提供此构造函数,编译器会为你创建它并将变量初始化为默认值。你可以选择覆盖此默认构造函数并将变量初始化为所需的值,如示例 1 所示。

但是如果你指定一个像 Demo(int a) 这样的参数化构造函数,并且想要使用默认构造函数 Demo(),那么你必须指定它。换句话说,如果你的构造函数被覆盖,并且你想使用默认构造函数,则需要指定它。

步骤 5: 取消注释行#4-8。保存、编译和运行代码。

构造函数链

想一下一个子类由子类扩展的场景。每当创建子类的对象时,首先调用父类的构造函数。这称为** Constructor chaining - 构造函数链**。

示例 3:了解构造函数链

步骤 1: 将以下代码复制到编辑器中。

class Demo{
   int  value1;
   int  value2;
    Demo(){
      value1 = 1;
      value2 = 2;
      System.out.println("Inside 1st Parent Constructor");
   }
   Demo(int a){
      value1 = a;
      System.out.println("Inside 2nd Parent Constructor");
   }
  public void display(){
     System.out.println("Value1 === "+value1);
     System.out.println("Value2 === "+value2);
  }
  public static void main(String args[]){
     DemoChild d1 = new DemoChild();
     d1.display();
  }
}
class DemoChild extends Demo{
    int value3;
    int value4;
    DemoChild(){
    //super(5);
     value3 = 3;
     value4 = 4;
    System.out.println("Inside the Constructor of Child");
    }
    public void display(){
      System.out.println("Value1 === "+value1);
      System.out.println("Value2 === "+value2);
      System.out.println("Value1 === "+value3);
      System.out.println("Value2 === "+value4);
   }
}

步骤 2: 运行代码。由于构造函数链接,当创建子类 DemoChild 的对象时,首先调用父类的构造函数 Demo(),然后创建子类的构造函数 DemoChild()。预期输出为

Inside 1st Parent Constructor
Inside the Constructor of Child
Value1 === 1
Value2 === 2
Value1 === 3
Value2 === 4

步骤 3: 你可能会观察到父类 Demo 的构造函数被覆盖。如果要在创建子对象时调用重写的构造函数 Demo(int a) 而不是默认构造函数 Demo(),该怎么办?

在这种情况下,你可以使用关键字** super **来调用父类的重写构造函数。

语法:

super();
// or
super(parameter list);

示例:如果你的构造函数类似于 Demo(String Name,int a),你将指定 super("Java",5),如果使用,则为关键字 super 需要是子类的构造函数中的第一行代码。

步骤 4: 取消注释 Line #26 并运行代码。观察输出。

输出:

Inside 2nd Parent Constructor
Inside the Constructor of Child
Value1 === 5
Value2 === 0
Value1 === 3
Value2 === 4