我们在编写代码的过程中,一般会用到
类名 对象名 = new 类名()
的方法创建新的对象,但你有没有想过new 类名()的最后的这个小括号有什么具体的作用呢?
如果你联想到一般方法中()的应用,你会发现一般方法中的小括号在非空的情况下大多用于传参,而创建对象时的这个括号是否也有传参的作用呢?
答案是是的,创建对象时的这个括号确实可以传参,但需要先写一个确定传入参数的类型和名称的构造方法。
就像这样(以学生xm的学分系统为例):
public class Student {
public String name;
public int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
public void Study(){
score += 10;
System.out.println(name+"学分增加10,现有学分"+score);
}
public static void main(String[] args) {
Student xm = new Student("xm",70);
xm.Study();
}
}
我们先写了构造方法确定传入的参数的类型和名称为 String name 和 int score,并分别赋值给属性name和属性score,然后在创建对象时我们传入具体的内容"xm"和70,使对象xm在创建时属性name和score就有初始值,即属性的初始化。
在创建对象时初始化属性就是构造函数的作用。
下面我们来讲讲构造函数的细节:
一,构造方法的格式
构造方法的格式为:
public 类名(参数类型 参数名){
方法体
}
对比普通方法的格式:
public 返回值类型 方法名(参数类型 参数名){
方法体
}
我们可以发现几点构造方法区别于方法的特点:
一,构造方法没有返回值类型,因为构造方法的功能是给创建对象的多个属性初始化,不需要返回值。
二,构造方法方法名必须与类名相同,普通方法则是自行命名的。
二,构造方法中可能出现的 this.属性 = 传入参数 解析
在文章开头部分的代码(学生xm的学分系统)中我们发现有这样两行带字母的代码:
this.name = name;
this.score = score;
代码中出现的this其实是为了区分重名的name属性和name参数。
我们结合代码来分析:
public String name;
public int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
前两行代码中定义的name和score是属性,而括号内的name和score是传入参数名,属性的name和传入参数名name是不同的。
而前面加上this是为了明确这个name是属性的name,另一个没有this的name是传入参数名。
this.name = name;
所以,上面这行代码的含义为:将传入参数name赋值给作为属性的name。
当然,我们也可以通过确保参数名和属性名不重名的方式避免这种需要使用this关键字区分属性名和参数名的情况。
比如这样:
public String name;
public int score;
public Student(String Name, int Score) {
name = Name;
score = Score;
}
三,构造方法中的方法重载
在定义了构造方法之后,我们需要在创建新对象时传入参数来初始化属性,如果像没有定义构造方法的时候那样,不传参直接创建新对象,我们会发现系统报错。
public class Student {
public String name;
public int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
public static void main(String[] args) {
Student xm = new Student();
//这里在定义了构造函数后,直接创建新对象(不传入name和score),就会报错
xm.Study();
}
}
这是因为每个类都有一个默认的无参构造方法,当自己定义构造方法后,默认的无参构造方法会被代替。
原来的无参构造方法被代替后,不传参的的创建新对象的方法将不可用,但是如果想在自己定义了新的构造方法后,还想同时使用默认无参构造方法的话,我们可以用到方法重载。
先看代码:
public class Student {
public String name;
public int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
public Student(){
}
public static void main(String[] args) {
Student xh = new Student()
Student xm = new Student("xm",70);
xm.Study();
}
}
我们发现,我们定义了两次构造方法,一个需要传入name和score参数,一个为无参构造方法,这样我们就通过对Student构造方法的方法重载,实现了既可以直接创建新对象,又可以在创建对象的同时初始化参数的不同功能。
这就是方法重载的作用:一个方法通过参数选择实现不同功能。
当然普通方法也可以使用这种方法重载的方式实现不同功能,但是在方法重载时需要注意:
1,方法名重名以确保我们在对同一个方法进行重载。
2,参数的类型(个数,顺序)需要不同,因为我们在调用方法时具体执行那些代码是通过参数的类型(个数,顺序)来选择的。
普通方法的方法重构举例:
public class Student {
//方法的方法重构,用传入的参数不同进行选择
public void Study(String Name){
System.out.println(Name+"正在学习");
}
public void Study(String Name,int Age) {
System.out.println(Age + "岁学生" + Name + "正在学习");
}
public void Study(String Name,int Age,int score){
System.out.println(Age + "岁学生" + Name + "正在学习,学分增加" + score);
}
public static void main(String[] args) {
Student student = new Student();
student.Study("lm",17); //传入name和Age调用第二个方法
student.Study("lm"); //传入name调用第一个方法
student.Study("lm",17,20); //传入name,Age和score调用第三个方法
}
}
最终程序输出结果为:
17岁学生lm正在学习
lm正在学习
17岁学生lm正在学习,学分增加20