定义
构造方法又叫构造器,是类的一种特殊的方法,它的作用是完成对新对象的初始化。它有以下几个特点:
- 方法名和类名相同。
- 没有返回值。
- 在创建对象时,系统会自动的调用该类的构造器完成对对象的初始化。
基本语法
[修饰符] 方法名(形参列表){
方法体;
}
public Student(int Age){
System.out.println(“构造方法”);
}
例:
public class Main {
public static void main(String[] args) {
Student p1=new Student("jack",20);//创建新对象时,直接通过构造器指定其名字和年龄
System.out.println("p1的name:");
System.out.println("p1的age:”+p1.age");
}
}
class Student{
String name;
int age;
public Student(String Name,int Age){
//(String Name,int Age)是构造器形参列表,规则和成员方法
name=Name;
age=Age;
}
}
输出结果:
p1的name:jack
p1的age:20
注意事项:
1)构造器没有返回值,也不能写void。
2)构造器的名称和类名”Student”需相同。
3)构造器是完成对象的初始化,并不是创建对象。
4)在创建对象时,系统自动的调用该类的构造方法。
构造器重载
定义:一个类可以定义多个不同的构造器,即构造器重载
例:
public class Main {
public static void main(String[] args) {
Student p1=new Student("jack",20);//创建第一个新对象
Student p2=new Student("rookie");//创建第二个新对象
System.out.println("p1的信息:");
System.out.println("p1的name:"+p1.name+);
System.out.println("p1的age:"+p1.age);
System.out.println("p2的信息:");
System.out.println("p2的name:"+p2.name);
System.out.println("p2的age:"+p2.age);
}
}
class Student{
String name;
int age;
public Student(String Name,int Age){//第一个构造器
name=Name;
age=Age;
}
public Student(String Name){//第二个构造器
name=Name;
}
}
输出结果:
p1的信息:
p1的name:jack
p1的age:20
p2的信息:
p2的name:rookie
p2的age:0
在创建第一个对象Student p1=new Student("jack",20)时,其中分别有String,int类型的两个参数,因此系统自动调用了第一个构造器,在此构造方法中,name和age都分别被赋予了有效值,输出为jack和20。
而因为创建第二个对象Student p2=new Student("rookie")时,其中只有一个String参数,系统为其匹配第二个构造方法,此时只有name被赋予有效值,而age则为默认初始值0。
此时大家可能好奇,在之前我们并未定义任何的构造方法,但编写的方法也可正常运行,这是为什么呢,这就要介绍下面的知识点:
如果程序员没有定义构造方法,系统会自动给类编写一个默认无参构造方法。
例如我们只定义一个类Night,而不在其内部定义构造器时,系统仍会为其编写一个无参构造函数,例:
public class Main {
public static void main(String[] args) {
Night lone=new Night();
}
}
class Night{
}
系统内部产生的默认构造器:
Night(){
}
明白这个知识点后,大家可能会产生新的疑问:既然系统原本有着一个构造方法,那么当我们为类编写新的构造方法后,原本的构造方法去哪了?他还能继续用吗?这就会引出另一个知识点:
一旦定义了自己的构造器,默认的构造器就被覆盖了。不能再继续使用,除非显式的进行定义
例如当我们编写一个新的构造方法时,系统内部调用的构造器就变成了我们编写的构造器“public Night(String name)”。
例:
public class Main {
public static void main(String[] args) {
Night deep=new Night("moon");
}
}
class Night{
public Night(String name){
}
}
系统内部产生的默认构造器:
class Night{
public Night(String name){
}
}
此时我们再想创建一个无赋值的新对象[Night deep=new Night() ]时,系统就会报错,除非显式的定义一下无参构造器,即:
Night(){
}
此时无论是创建有参对象Night deep=new Night("moon");亦或者创建无参对象Night deep=new Night();系统都不会报错。
例:
public class Main {
public static void main(String[] args) {
Night deep = new Night("moon");
Night lone = new Night();
}
}
class Night {
public Night(String name) {
}
Night() {
}
}
代码便可正常运行。