精通 Java 构造器:类型、用法与实战示例
Java 构造器
本教程通过示例讲解 Java 构造器、其类型及用法。
什么是构造器?
Java 构造器类似于在创建类的对象时调用的方法。
与 Java 方法不同,构造器与类同名且无返回类型。例如:
class Test {
Test() {
// 构造器体
}
}
此处 Test() 是构造器。它与类同名且无返回类型。
推荐阅读: 为什么构造器不返回值
示例 1: Java 构造器
class Main {
private String name;
// 构造器
Main() {
System.out.println("Constructor Called:");
name = "Programiz";
}
public static void main(String[] args) {
// 创建 Main 类对象时调用构造器
Main obj = new Main();
System.out.println("The name is " + obj.name);
}
}
输出:
Constructor Called: The name is Programiz
上例创建名为 Main() 的构造器。构造器内初始化 name 变量。
注意创建 Main 类对象的语句:
Main obj = new Main();
创建对象时调用 Main() 构造器,name 变量被初始化。
故程序打印 name 值为 Programiz。
构造器类型
Java 中构造器可分为 3 类:
- 无参构造器
- 带参构造器
- 默认构造器
1. Java 无参构造器
类似方法,Java 构造器可有参数也可无参数。
若构造器不接受任何参数,称为无参构造器。例如:
private Constructor() {
// 构造器体
}
示例 2: Java private 无参构造器
class Main {
int i;
// 无参数构造器
private Main() {
i = 5;
System.out.println("Constructor is called");
}
public static void main(String[] args) {
// 无参数调用构造器
Main obj = new Main();
System.out.println("Value of i: " + obj.i);
}
}
输出:
Constructor is called Value of i: 5
上例创建构造器 Main()。构造器不接受参数,故为无参构造器。
注意构造器声明为 private。
构造器一旦声明 private,外部无法访问。故禁止用 private 构造器在类外创建对象。
此处在同一类内创建对象,故程序能访问构造器。详见 Java 实现私有构造器。
若想在类外创建对象,需声明构造器为 public。
示例 3: Java public 无参构造器
class Company {
String name;
// 公共构造器
public Company() {
name = "Programiz";
}
}
class Main {
public static void main(String[] args) {
// 在另一个类中创建对象
Company obj = new Company();
System.out.println("Company name = " + obj.name);
}
}
输出:
Company name = Programiz
推荐阅读: Java 访问修饰符
2. Java 带参构造器
Java 构造器也可接受一个或多个参数。此类构造器称为带参构造器 (带参数的构造器)。
示例 4: 带参构造器
class Main {
String languages;
// 接受单个值的构造器
Main(String lang) {
languages = lang;
System.out.println(languages + " Programming Language");
}
public static void main(String[] args) {
// 调用构造器传递单个值
Main obj1 = new Main("Java");
Main obj2 = new Main("Python");
Main obj3 = new Main("C");
}
}
输出:
Java Programming Language Python Programming Language C Programming Language
上例创建构造器 Main(),接受单个参数。注意表达式:
Main obj1 = new Main("Java");
此处向构造器传递单个值。根据传入参数,构造器内初始化 language 变量。
3. Java 默认构造器
若未显式创建构造器,Java 编译器在程序执行时自动创建无参构造器。此构造器称为默认构造器。
示例 5: 默认构造器
class Main {
int a;
boolean b;
public static void main(String[] args) {
// 调用默认构造器
Main obj = new Main();
System.out.println("Default Value:");
System.out.println("a = " + obj.a);
System.out.println("b = " + obj.b);
}
}
输出:
a = 0 b = false
此处未创建任何构造器。故 Java 编译器自动创建默认构造器。
默认构造器将未初始化的实例变量设为默认值。
| 类型 | 默认值 |
|---|---|
boolean | false |
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
char | \u0000 |
float | 0.0f |
double | 0.0d |
object | 引用 null |
上程序中 a 和 b 分别初始化为默认值 0 和 false。
上程序等价于:
class Main {
int a;
boolean b;
// 一个私有构造器
private Main() {
a = 0;
b = false;
}
public static void main(String[] args) {
// 调用构造器
Main obj = new Main();
System.out.println("Default Value:");
System.out.println("a = " + obj.a);
System.out.println("b = " + obj.b);
}
}
程序输出与示例 5 相同。
Java 构造器重要注意事项
- 实例化对象时隐式调用构造器。
- 创建构造器两条规则:
构造器名必须与类同名。
Java 构造器不能有返回类型。 - 类无构造器时,Java 编译器运行时自动创建 默认构造器。默认构造器用默认值初始化实例变量。例如
int变量初始化为0。 - 构造器类型:
无参构造器 – 不接受参数
带参构造器 – 接受参数
默认构造器 – 未显式定义时编译器自动创建。 - 构造器不能是
abstract、static或final。 - 构造器可重载但不能重写。
Java 构造器重载
类似 Java 方法重载,可创建两个或多个参数不同的构造器。这称为构造器重载。
示例 6: Java 构造器重载
class Main {
String language;
// 无参构造器
Main() {
this.language = "Java";
}
// 带单参数构造器
Main(String language) {
this.language = language;
}
public void getName() {
System.out.println("Programming Langauage: " + this.language);
}
public static void main(String[] args) {
// 调用无参构造器
Main obj1 = new Main();
// 调用带参构造器
Main obj2 = new Main("Python");
obj1.getName();
obj2.getName();
}
}
输出:
Programming Language: Java Programming Language: Python
上例有两个构造器:Main() 和 Main(String language)。两者用不同值初始化 language 变量。
根据对象创建时传入的参数,调用不同构造器并赋不同值。
也可从一个构造器调用另一个构造器。详见 Java 从一个构造器调用另一个。
注意:使用 this 关键字指定类变量。了解 this 关键字请访问 Java this 关键字。
java
- C++构造函数详解:默认、参数化与拷贝构造函数
- 精通 Java 运算符:类型、语法与实战示例
- Java 注释:类型、用法与最佳实践
- 精通 Java 增强 for 循环:语法、示例与最佳实践
- 精通 Java 构造器:类型、用法与实战示例
- 精通 Java 字符串:创建、方法与最佳实践
- Java StringBuilder 与 StringBuffer:高性能字符串操作
- 精通 Java 接口:概念、实现与最佳实践
- 精通 Java 匿名内部类:定义、语法与实战示例
- Java 枚举构造器详解与实战示例
- 精通 Java Try-With-Resources:自动资源管理详解
- Java 注解详解:类型、放置位置与实战示例