Java类的构造方法(非常详细)
Java 类中有一种非常特殊的方法,它会在创建对象时自动被调用,通常用于对象的初始化工作,它就是构造方法。
定义一个构造方法的语法如下:
构造方法有如下特点:
假设有一个 Student 类,它包含 id、age 和 name 三个属性。观察下面的实例程序。
当我们要创建“xiaoming”对象时,可以通过下面的语句实现:
一个类可以包含多个构造方法,它们的方法名相同,只是参数列表不同而已,如下面的程序所示:
当执行 new 指令创建对象时,可以根据实际情况传入不同的参数,比如主方法中分别使用了三种构造方法。注意,当我们不传入任何参数值给构造方法时,生成的对象的属性都为默认值,比如“new Student()”,生成对象的 id、age、name 三个属性的值分别为 0、0、null。
实际上,如果我们没有定义任何构造方法,那么 Java 编译器会帮我们加上一个默认的无参构造方法。如下图所示,Teacher 类通过编译器编译后就会被加上一个默认的构造方法。

图 1 默认构造方法
不过编译器并非总是会帮我们加上无参构造方法,例如:
所以可以总结一下,一旦我们定义了任意一个构造方法,编译器就不会再帮我们生成默认构造方法,此时对于要用到的所有构造方法,都需要我们自己去定义。
定义一个构造方法的语法如下:
访问修饰符 方法名(参数列表) { 方法体 }首先是访问修饰符(非必需的)。然后是方法名和参数列表,其中方法名必须与类名相同,如果要定义无参的构造方法则直接使用()即可。最后是方法体,由一对大括号指定,所有初始化语句都在大括号内编写。
构造方法有如下特点:
- 构造方法名必须与类名相同;
- 构造方法不能有返回值类型;
- 构造方法不能使用 static、final、synchronized 和 abstract 等修饰符;
- 一个类可以有多个构造方法,只要它们的参数列表不同;
- 构造方法只在执行 new 指令时被隐式地调用,我们无法显式地去调用它。
假设有一个 Student 类,它包含 id、age 和 name 三个属性。观察下面的实例程序。
public class Student { int id; int age; String name; public Student(int id, int age, String name) { this.id = id; this.age = age; this.name = name; } }程序中定义了一个包含三个参数的构造方法,可以看到它的名字 Student 与类名是相同的,传入的三个参数值分别赋值给构造的对象的 id、age、name 这三个属性。
当我们要创建“xiaoming”对象时,可以通过下面的语句实现:
Student xiaoming = new Student("小明");传入的三个参数值会分别赋值给“xiaoming”对象的三个属性。
一个类可以包含多个构造方法,它们的方法名相同,只是参数列表不同而已,如下面的程序所示:
public class Student { int id; int age; String name; public Student() { } public Student(int id, String name) { this.id = id; this.name = name; } public Student(int id, int age, String name) { this.id = id; this.age = age; this.name = name; } public static void main(String[] args) { Student xiaoming = new Student("小明"); Student xiaodong = new Student("小东"); Student somebody = new Student(); } }可以看到第一个构造方法不包含任何参数,第二个只包含 id 和 name 两个参数,第三个则包含了 id、age 和 name 三个参数。
当执行 new 指令创建对象时,可以根据实际情况传入不同的参数,比如主方法中分别使用了三种构造方法。注意,当我们不传入任何参数值给构造方法时,生成的对象的属性都为默认值,比如“new Student()”,生成对象的 id、age、name 三个属性的值分别为 0、0、null。
Java默认构造方法
有时我们会看到某些类没有定义任何构造方法,是不是就意味着不能创建该类的对象呢?public class Teacher { public int age; public String name; }观察上面的 Teacher 类,该类仅定义了 age 和 name 两个属性,没有定义任何构造方法,那么我们能不能通过“new Teacher();”来创建对象呢?
实际上,如果我们没有定义任何构造方法,那么 Java 编译器会帮我们加上一个默认的无参构造方法。如下图所示,Teacher 类通过编译器编译后就会被加上一个默认的构造方法。

图 1 默认构造方法
不过编译器并非总是会帮我们加上无参构造方法,例如:
public class Teacher { public int age; public String name; public Teacher(int age, String name) { this.age = age; this.name = name; } }我们已经定义了一个有参构造方法,这时编译器就不会再帮我们生成无参构造方法,如果我们使用“new Teacher();”将会报错。
所以可以总结一下,一旦我们定义了任意一个构造方法,编译器就不会再帮我们生成默认构造方法,此时对于要用到的所有构造方法,都需要我们自己去定义。
Java构造方法和成员方法的区别
构造方法与成员方法非常相似,不过它们之间也有一些区别。关于构造方法和成员方法,我们通过下表来进行一个对比总结,这样就能更好地理解它们。对比项 | 构造方法 | 成员方法 |
---|---|---|
作用 | 用于在创建一个对象时对其进行初始化 | 用于暴露某个对象的行为操作以供调用 |
命名 | 必须与类名相同 | 根据需要自定义 |
返回值 | 不能定义返回值 | 必须定义返回值 |
调用时机 | 执行 new 时隐式地调用 | 编程者显式地调用 |