Java 构造器
在Java中,构造器(Constructor)是一种特殊的方法,用于创建和初始化对象。它与类名相同,没有返回类型(甚至不能写void),主要用于在对象创建时设置对象的初始状态。构造器在面向对象编程中起着至关重要的作用,它确保了每个对象在创建时都有一个有效的初始状态。在对象创建时,Java虚拟机(JVM)会自动调用构造器,以确保对象的初始状态。
构造器的基本语法
public class ClassName {
// 构造器
public ClassName() {
// 初始化代码
}
}
-
声明了一个公共(public)的类,名为
ClassName
。 -
这是一个公共的无参数构造器,它没有做任何事情,只是简单地创建了一个新的
ClassName
对象。如果将来需要在这个构造器中执行一些初始化操作,可以在大括号 {} 中添加相应的代码。
构造器的类型
默认构造器
如果一个类没有显式定义任何构造器,Java编译器会自动提供一个无参数的默认构造器。这个默认构造器不做任何特殊操作,只是简单地创建一个对象。
public class Student {
// 编译器会自动提供一个无参数的默认构造器
}
public class Main {
public static void main(String[] args) {
Student student = new Student(); // 调用默认构造器
}
}
自定义构造器
可以定义一个或多个自定义构造器来初始化对象的不同状态。自定义构造器可以包含参数,用于设置对象的初始属性值。
public class Student {
String name;
int age;
// 自定义构造器
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
public class Main {
public static void main(String[] args) {
Student student = new Student("Alice", 20); // 调用带参数的构造器
}
}
构造器重载
构造器可以被重载,即在一个类中可以定义多个构造器,它们的参数列表(参数类型、个数或顺序)不同。这使得对象初始化更加灵活。
public class Student {
String name;
int age;
// 无参数构造器
public Student() {
this.name = "Unknown";
this.age = 0;
}
// 带一个参数的构造器
public Student(String name) {
this.name = name;
this.age = 0;
}
// 带两个参数的构造器
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
public class Main {
public static void main(String[] args) {
Student student1 = new Student();
Student student2 = new Student("Bob");
Student student3 = new Student("Charlie", 22);
}
}
构造器的调用
自动调用
在创建对象时,JVM会自动调用相应的构造器来初始化对象。
Student student = new Student("Alice", 20); // 调用带参数的构造器
在构造器中调用另一个构造器
在构造器中,可以使用 this
关键字调用同一类中的另一个构造器。这种调用必须是构造器中的第一条语句。
public class Student {
String name;
int age;
public Student() {
this("Unknown", 0); // 调用带参数的构造器
}
public Student(String name) {
this(name, 0); // 调用带两个参数的构造器
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
在子类构造器中调用父类构造器
在子类的构造器中,可以使用 super
关键字调用父类的构造器。这种调用也必须是子类构造器中的第一条语句。
public class Person {
String name;
public Person(String name) {
this.name = name;
}
}
public class Student extends Person {
int age;
public Student(String name, int age) {
super(name); // 调用父类的构造器
this.age = age;
}
}
构造器的注意事项
- 没有返回类型:构造器不能有返回类型(甚至不能写
void
),否则它会被认为是一个普通方法。 - 名称必须与类名相同:构造器的名称必须与类名完全相同。
- 自动调用:在创建对象时,JVM会自动调用构造器。
- 默认构造器:如果类中没有显式定义任何构造器,编译器会自动提供一个无参数的默认构造器。但是,一旦显式定义了构造器(无论是有参还是无参),编译器就不会再提供默认构造器。
- 构造器重载:可以在一个类中定义多个构造器,
- this 和 super 的使用:在构造器中,
this
用于调用同一类中的另一个构造器,而super
用于调用父类的构造器。这两种调用都必须是构造器中的第一条语句。