1、构造器根据形式参数类型的不同组合可以形成多种不同的类型的构造器。如下图有一个简单的学生类
public class Student {
private String name;
private String phoneNumber;
// 构造器1:没有任何形式参数
public Student() {
}
// 构造器2:只接受name作为参数
public Student(String name) {
this.name = name;
}
// 构造器3:只接受phoneNumber作为参数
public Student(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
// 构造器4:接受name和phoneNumber作为参数
public Student(String name,String phoneNumber) {
this.name = name;
this.phoneNumber = phoneNumber;
}
// 其他方法...
}
这个类中有两个String类型的属性,分别是name和phoneNumber。这时候可以有3种不同的形式参数类型组合,分别是空,String和String String。对于上面代码给出的四种构造器,构造器2和3均属于只有一个Sring类型形式参数的构造器,虽然他们的传入参数的名称和执行的功能不一样,但是对于编译器来讲,是无法体会到这种不同,编译器会把构造器2和3当作同一个构造器,此时会提示错误‘Student(String)’ is already defined in ‘Student’。因此虽然一个类中可以有多个构造器,但是这些构造器的形参类型组合必须是不同的。*
此时我们进一步进行分析,这个形参类型组合和不同类型参数的次序有关系吗?比如Student(int,String)和Student(String,int)是同一个构造器吗?为此,我们设置下面的代码
public class Student {
private String name;
private int age;
// 构造器1:没有任何形式参数
public Student() {
}
// 构造器2:只接受name作为参数
public Student(String name) {
this.name = name;
}
// 构造器3:只接受age作为参数
public Student(int age) {
this.age = age;
}
// 构造器4:接受name和age作为参数
public Student(String name,int age) {
this.name = name;
this.age = age;
}
// 构造器5:接受name和age作为参数
public Student(int age,String name) {
this.name = name;
this.age = age;
}
// 其他方法...
}
这时候我们设置了5个不同的构造器,此时构造器4和构造器5均是可以正常是使用的,因此对于构造器而言形参类型组合中不同的次序是属于不同的组合
这里我们经过分析发现构造器属于一个方法,而不同的构造器方法属于同一个类内的,所以这种设置多个构造器,其实是属于方法的重载
为此我们将上面的发现推广到其他普通的方法,看是否成立,为此我们设置了一个类别,
public class Student {
private String name;
private int age;
public Student() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void study() {
System.out.println("正在学习");
}
public void study(String name) {
System.out.println(name + "正在学习");
}
public void study(int age) {
System.out.println(age + "正在学习");
}
public void study(String name, int age) {
System.out.println(name + age + "正在学习");
}
public void study(int age, String name) {
System.out.println(age + name + "正在学习");
}
public static void main(String[] args) {
Student student = new Student();
student.setAge(10);
student.setName("Jane");
student.study();
student.study(student.getName());
student.study(student.getAge());
student.study(student.getName(), student.getAge());
student.study(student.getAge(), student.getName());
}
}
运行结果
通过运行结果来看,普通方法和构造器方法重写具有相同的规律,为此,我们得出结论对于方法重载来讲,方法之间的形参列表必须不同,包括形参的个数和形参类型的顺序不同中的其中一个,参数名不同不符合上述要求,如上面的public Student(String name) { this.name = name;}// 构造器3:只接受phoneNumber作为参数public Student(String phoneNumber) { this.phoneNumber = phoneNumber;}他们都是一个形参,并且都是String类型。再比如public Student(String name,String phoneNumber)和public Student(String phoneNumber ,String name)也不属于方法重载,因为都是两个String,并且形参类型顺序都是String,String,不满足参数个数和形参类型顺序不同