构造方法介绍
用于创建对象的方法,我们在前面的章节中对类和对象有了一定初步认识,不知道大家是否还记得使用new创建对象,其语法格式为类名 对象名 = new 类构造方法();何为构造方法?它是一种特殊的类方法成员,用于创建对象时进行初始化。构造方法主要作用包括两方面: 构造一个类的实例对象 对实例对象进行初始化;构造方法是一种特殊方法,它的名字必须与它所在的类的名字完全相同,并且不书写返回值类型,在创建对象实例时由new运算符自动调用。
构造方法又有无参构造器,和有参构造器
无参构造器:初始化对象为默认地址
有参构造器:在初始化对象的时候为对象赋值、
语法规则
方法名与类名相同
声明中没有返回值类型
可以有参数列表
默认构造方法
定义一个不带构造方法的Teacher类:
public class Teacher {
/*
* 教师类属性:
* name - 教师姓名
* age - 教师年龄
* salary - 教师工资
*/
private String name;
private int age;
private int salary;
/*
* 获取教师名字
*/
public String getName() {
return this.name;
}
/*
* 设置教师名字
*/
public void setName(String name) {
this.name = name;
}
}
public class ConstructorDeamon {
public static void main(String[] args) {
Teacher t = new Teacher();
System.out.println("默认构造方法创建教师对象,该老师名字是" + t.getName());
// 设置老师名字
t.setName("职场未来浩老师");
System.out.println("老师名字已经更新,现在老师名字是" + t.getName());
}
}
结合代码,我们一起看看,Teacher类中是没有显示定义构造方法的,我们前面讲过,使用new构建对象时,Teacher t = new Teacher();
,需要构造方法。但是类中没有显示定义,而对象能够创建出来,说明编译器帮我们主动加了一个构造方法,该方法也称为默认构造方法:
public Teacher() {
}
从代码运行结果也能看出这一点,第一行显示为“默认构造方法创建教师对象,该老师名字是null”。大家想想为什么null?因为name的数据类型为String,String的默认值是null;侧面印证了默认构造方法的存在,它没有给对象t中任何属性字段赋值,
因此,每个属性采用的是默认值。如果类使用默认构造方法的话,我们想要改变对象的状态(也就是属性),我们需要额外定义设置方法,例如,Teacher类中定了public void setName(String name)
。当我们设置老师对象姓名t.setName("职场未来浩老师");
后,再次打印老师名字时,名字是有效的。
另一个例子
public class Student {
private String name;
private String age;
Student(){
System.out.println(“new 时执行”)
}
public static void main(String[] args) {
Student s =new Student();
System.out.println(s.name);
}
}
重载构造方法
重载是指同一个类中定义多个方法名相同但是参数列表不同的方法。构造方法的重载同样遵循方法重载的规则,为什么需要重载构造方法呢?基于以下几方面的原因:
- 简化代码:有时候,我们需要创建具有不同参数的对象实例,如果每个对象都使用不同的构造方法,会导致代码量很大。通过重载构造方法,我们可以使用相同的构造方法名,但不同的参数列表来创建不同的对象实例,从而简化代码。
- 参数检验:在创建对象时,我们可能需要检查传递给构造方法的参数是否符合要求。通过重载构造方法,我们可以根据不同的参数列表来检查参数的有效性,从而保证对象的正确性。
- 灵活性:重载构造方法使得对象的创建更加灵活。我们可以根据需要选择传递给构造方法的参数,从而创建具有不同属性的对象实例。
- 可读性:重载构造方法使得代码更加清晰易懂。通过查看构造方法的参数列表,我们可以清楚地了解每个构造方法的作用,从而更好地理解对象的创建方式。
重载构造方法核心原因是为了提高代码的可读性和灵活性,简化代码,提高程序的健壮性。
改造一下Teacher类,适配不同Teacher对象的创建,具体代码示例
public class Teacher {
/*
* 教师类属性:
* name - 教师姓名
* age - 教师年龄
* salary - 教师工资
*/
private String name;
private int age;
private int salary;
// 显示定义默认构造方法
public Teacher() {
}
// 只设置教师名字属性的构造方法
public Teacher(String name) {
this.name = name;
}
// 设置教师名字和年龄属性的构造方法
public Teacher(String name, int age) {
this.name = name;
this.age = age;
}
// 教师名字、年龄和工资均设置的构造方法
public Teacher(String name, int age, int salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
}
Teacher类中提供了四种可供选择构造方法,其中,public Teacher()
显示定义的默认构造方法。创建Teacher对象时,我们就有了更多的选择。
另一个例子
public class Student {
private String name;
private String age;
private String sex;
Student(String name,String age){
this.name=name;
this.age=age;
}
Student(String name,String age,String sex){
this.name=name;
this.age=age;
this.sex =sex;
}
public static void main(String[] args) {
Student s =new Student("张三","10");
System.out.println(s.name);
System.out.println(s.age);
Student s1 =new Student("张三1","22","男");
System.out.println(s1.name);
System.out.println(s1.age);
System.out.println(s1.sex);
}
}
//练习定义一个Book类,有字符串name,整数price两个属性,
声明一个构造方法name,为name赋值
再声明一个构造方法为name,price 赋值。
并分别创建两个实例,用这两个构造方法。
练习toString()方法