Java 构造函数
Java 构造函数是一种在对象创建时自动调用的特殊方法,主要用于初始化新创建的对象的状态。
在 Java 中,每个类都有它的构造函数,即使用户没有显式定义,Java 编译器也会自动提供一个默认的无参构造函数。构造函数的名称必须与类名完全相同,没有返回类型声明,甚至不需要void
关键字,这是它与其他方法的显著区别之一。
构造函数的主要职责是为对象的字段赋予初始值。当使用new
关键字创建对象时,构造函数负责设置对象的初始状态,防止出现未初始化的字段或无效的对象状态。
✅ 以下是一个名为MyClass()
的 Java 构造函数。它具有与该类相同的名称,并且没有返回类型:
public class MyClass {
// 构造函数
public MyClass() {
// 初始化代码
}
}
✅ 同样名为MyClass()
的函数,但是它有一个返回类型void
。因此,他只是普通的 Java 方法不是构造函数:
public class MyClass {
// 构造函数
public void MyClass() {
// 初始化代码
}
}
Java 构造函数类型
在 Java 中,构造函数主要分为三种类型:默认构造函数、无参构造函数和参数化构造函数。
1. 默认构造函数
如果不显式定义任何构造函数,Java 编译器会在编译时自动生成一个无参数的构造函数,称为默认构造函数。该构造函数会将所有未初始化的实例变量设置为其默认值。
✅ 以下是一个默认构造函数的简单实例:
class DefaultConstructor {
int a;
boolean b;
public static void main(String[] args) {
// 使用默认构造函数创建对象
DefaultConstructor obj = new DefaultConstructor();
System.out.println("a = " + obj.a);
System.out.println("b = " + obj.b);
}
}
执行这个程序后,输出结果:
a = 0
b = false
在上面的程序中,我们并未显式初始化变量a
和b
的值。然而,在创建类的对象后,输出结果显示这两个变量已被自动初始化为特定值。
这是因为 Java 编译器自动生成了一个默认构造函数。该构造函数会在对象创建时执行,将未初始化的实例变量赋予其类型的默认值——例如int
类型变量a
被初始化为 0
,boolean
类型变量b
被初始化为 false
。
2. 无参数构造函数
Java 中的构造函数可以接受参数,也可以不接受任何参数。如果构造函数不接受任何参数,则称为 “无参构造函数”。
✅ 以下是一个无参构造函数的简单实例:
class Main {
int i;
// 无参构造函数
private Main() {
i = 5;
System.out.println("对象已创建,i = " + i);
}
public static void main(String[] args) {
// 调用无参构造函数
Main obj = new Main();
}
}
执行这个程序后,输出结果:
Object created and i = 5
在上面的程序中,我们定义了一个名为Main()
的无参构造函数。
该构造函数在对象创建时被自动调用,并将实例变量i
初始化为 5
。当我们在main()
方法中使用new
关键字创建Main
类的对象时,构造函数被触发,输出了初始化后的变量值。
参数化构造函数
与普通方法类似,我们也可以向构造函数传递参数。这种接受参数的构造函数被称为参数化构造函数。
✅ 以下是一个参数化构造函数的简单实例:
class Vehicle {
int wheels;
// 参数化构造函数
private Vehicle(int wheels) {
this.wheels = wheels;
System.out.println(wheels + " 轮车辆已创建。");
}
public static void main(String[] args) {
// 通过传入参数调用构造函数
Vehicle v1 = new Vehicle(2);
Vehicle v2 = new Vehicle(3);
Vehicle v3 = new Vehicle(4);
}
}
执行这个程序后,输出结果:
2 wheeler vehicle created.
3 wheeler vehicle created.
4 wheeler vehicle created.
在上面的程序中,我们定义了一个名为Vehicle(int wheels)
的参数化构造函数。
Java 构造函数重载
构造函数重载是指在同一个类中,可以定义多个构造函数,这些构造函数具有相同的名称(即类名),但参数列表(参数的类型、数量或顺序)不同。
当创建对象时,Java 编译器会根据传递的参数类型和数量来决定调用哪个构造函数。
✅ 以下是一个构造函数重载的简单实例:
class Company {
String domainName;
// 没有参数的构造函数
public Company(){
this.domainName = "default";
}
// 具有单个参数的构造函数
public Company(String domainName){
this.domainName = domainName;
}
public void getName(){
System.out.println(this.domainName);
}
public static void main(String[] args) {
// 不带参数调用构造函数
Company defaultObj = new Company();
// 使用单个参数调用构造函数
Company kaiczObj = new Company("(kaicz.com)");
defaultObj.getName();
kaiczObj.getName();
}
}
执行这个程序后,输出结果:
default
(kaicz.com)
在上面的程序中,我们定义了一个名为Company
的类,并在其中实现了两个重载的构造函数。
第一个构造函数不接受任何参数,并将实例变量domainName
初始化为字符串 "default"
。第二个构造函数接受一个字符串参数,并将其赋值给实例变量domainName
。
在main()
方法中,我们分别使用这两个构造函数创建了Company
类的对象。第一个对象defaultObj
使用无参构造函数创建,第二个对象kaiczObj
使用带参数的构造函数创建。
反馈提交成功
感谢您的反馈,我们将尽快处理您的反馈