跳到主要内容

Java构造函数

提示
  1. 构造器的基本概念:Java中的构造器是一个特殊的方法,用于在创建对象时初始化对象,名称与类名相同且没有返回类型。
  2. 构造器的类型与使用:Java支持无参构造器、带参数的构造器以及默认构造器(若未定义任何构造器,编译器自动生成)。
  3. 构造器重载:Java允许构造器重载,即一个类中可以有多个构造器,它们通过参数列表的不同进行区分。

什么是构造器?

Java 中的构造器类似于一个方法,当创建类的对象时,它会被调用。

Java 方法 不同,构造器与类名相同,没有任何返回类型。例如,

class Test {
Test() {
// 构造器体
}
}

这里,Test() 是一个构造器。它与类名相同且没有返回类型。

推荐阅读: 为什么构造器不返回值

示例 1:Java 构造器

class Main {
private String name;

// 构造器
Main() {
System.out.println("构造器被调用:");
name = "mashangxue123";
}

public static void main(String[] args) {

// 创建 Main 类对象时
// 调用构造器
Main obj = new Main();
System.out.println("名字是 " + obj.name);
}
}

输出

构造器被调用:
名字是 mashangxue123

在上面的示例中,我们创建了一个名为 Main() 的构造器。在构造器内部,我们初始化了 name 变量的值。

注意创建 Main 类对象的语句。

Main obj = new Main();

这里,当对象被创建时,Main() 构造器被调用。并且,name 变量的值被初始化。

因此,程序打印出 name 变量的值,即 mashangxue123

构造器的类型

在 Java 中,构造器可以分为 3 种类型:

  1. 无参构造器
  2. 带参数的构造器
  3. 默认构造器

1. Java 无参构造器

与方法类似,Java 构造器可能有也可能没有任何参数(参数)。

如果构造器不接受任何参数,则称为无参数构造器。例如,

private Constructor() {
// 构造器的体
}

示例 2:Java 私有无参构造器

class Main {

int i;

// 无参数的构造器
private Main() {
i = 5;
System.out.println("构造器被调用");
}

public static void main(String[] args) {

// 调用没有任何参数的构造器
Main obj = new Main();
System.out.println("i 的值: " + obj.i);
}
}

输出

构造器被调用
i 的值: 5

在上面的示例中,我们创建了一个 Main() 构造器。这里,构造器不接受任何参数。因此,它被称为无参构造器。

注意我们将构造器声明为私有。 一旦构造器被声明为 private,它就不能从类外部访问。因此,使用私有构造器从类外部创建对象是被禁止的。

这里,我们在同一个类内部创建对象。因此,程序能够访问到这个构造器。要了解更多,请访问 Java 实现私有构造器

然而,如果我们想要在类外部创建对象,那么我们需要将构造器声明为 public

示例 3:Java 公共无参构造器

class Company {
String name;

// 公共构造器
public Company() {
name = "mashangxue123";
}
}

class Main {
public static void main(String[] args) {

// 在另一个类中创建对象
Company obj = new Company();
System.out.println("公司名称 = " + obj.name);
}
}

输出

公司名称 = mashangxue123

推荐阅读: Java 访问修饰符

2. Java 带参数构造器

Java 构造器也可以接受一个或多个参数。这样的构造器被称为带参数构造器(构造器带有参数)。

示例 4:带参数的构造器

class Main {

String languages;

// 接受单个值的构造器
Main(String lang) {
languages = lang;
System.out.println(languages + " 编程语言");
}

public static void main(String[] args) {

// 通过传递单个值调用构造器
Main obj1 = new Main("Java");
Main obj2 = new Main("Python");
Main obj3 = new Main("C");
}
}

输出

Java 编程语言
Python 编程语言
C 编程语言

在上述示例中,我们创建了名为 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("默认值:");
System.out.println("a = " + obj.a);
System.out.println("b = " + obj.b);
}
}

输出

默认值:
a = 0
b = false

在这里,我们没有创建任何构造器。因此,Java 编译器自动创建了默认构造器。

默认构造器将未初始化的实例变量初始化为默认值。

类型默认值
booleanfalse
byte0
short0
int0
long0L
char\u0000
float0.0f
double0.0d
objectReference null

在上述程序中,变量 ab 分别被初始化为默认值 0false

上述程序等同于:

class Main {

int a;
boolean b;

Main() {
a = 0;
b = false;
}

public static void main(String[] args) {
// 调用构造器
Main obj = new Main();

System.out.println("默认值:");
System.out.println("

a = " + obj.a);
System.out.println("b = " + obj.b);
}
}

程序的输出与示例 5 相同。

关于 Java 构造器的重要说明

  • 创建对象时会隐式调用构造器。
  • 创建构造器的两条规则是: 构造器的名称应与类名相同。 Java 构造器不能有返回类型。
  • 如果一个类没有构造器,Java 编译器会在运行时自动创建一个 默认构造器。默认构造器将实例变量初始化为默认值。例如,int 变量将被初始化为 0
  • 构造器类型: 无参构造器 - 不接受任何参数的构造器 带参数构造器 - 接受参数的构造器 默认构造器 - 如果未显式定义,则由 Java 编译器自动创建的构造器。
  • 构造器不能是 abstractstaticfinal
  • 构造器可以重载,但不能重写。

Java 中的构造器重载

类似于Java 方法重载,我们也可以创建具有不同参数的两个或更多构造器。这被称为构造器重载。

示例 6:Java 构造器重载

class Main {

String language;

// 无参数的构造器
Main() {
this.language = "Java";
}

// 带单个参数的构造器
Main(String language) {
this.language = language;
}

public void getName() {
System.out.println("编程语言: " + this.language);
}

public static void main(String[] args) {

// 调用无参数的构造器
Main obj1 = new Main();

// 调用带单个参数的构造器
Main obj2 = new Main("Python");

obj1.getName();
obj2.getName();
}
}

输出

编程语言: Java
编程语言: Python

在上述示例中,我们有两个构造器:Main()Main(String language)。这里,两个构造器以不同的值初始化 language 变量。

根据在对象创建期间传递的参数,调用不同的构造器并分配不同的值。

也可以从另一个构造器调用一个构造器。要了解更多,请访问 Java 从另一个构造器调用一个构造器

注意:我们使用了 this 关键字来指定类的变量。要了解更多关于 this 关键字,请访问 Java this 关键字