Java 中的构造函数
Java 中的构造函数是什么?
构造函数 - Constructor 是一种特殊方法,用于初始化新创建的对象,并在为对象分配内存后立即调用。它可用于在创建对象时将对象初始化为所需的值或默认值。用户可以不必为类编写构造函数。
如果没有为类提供用户定义的构造函数,则编译器会将成员变量初始化为其默认值。
- 数字数据类型设置为
0
- char 数据类型设置为空字符(
\0
) - 引用变量设置为
null
在本教程中,你将学习 -
- 什么是 Java 中的构造函数?
- 创建构造函数的规则
- 构造函数重载
- 构造链接
创建 Java 构造函数的规则
- 它与类同名
- 它不应该返回一个值甚至是
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)
,如果使用,则为关键字 supe
r 需要是子类的构造函数中的第一行代码。
步骤 4: 取消注释 Line #26 并运行代码。观察输出。
输出:
Inside 2nd Parent Constructor
Inside the Constructor of Child
Value1 === 5
Value2 === 0
Value1 === 3
Value2 === 4