为什么这个类有两个构造函数?

我在幻灯片中看到了这一点,旨在说明构造函数。 我现在很困惑,因为它有两个具有相同作业的构造函数接受在第二个中将gpa设置为零。 为什么编码器需要重复this.id = id; this.name = name; this.id = id; this.name = name; 再次? 为什么这个类甚至需要两个构造函数?

 class Student{ private int id; private String name; private double gpa; public Student(int id, String name, double gpa){ this.id = id; this.name = name; this.gpa = gpa; } public Student(int id, String name){ this.id = id; this.name = name; gpa = 0.0; } public boolean equals(Student other){ return id == other.id && name.equals(other.name) && gpa == other.gpa; } public String toString(){ return name + " " + id + " " + gpa; } public void setName(String name){ this.name = name; } public double getGpa(){ return gpa; } } 

与大多数人为的例子一样,除了表明超载是可能的之外,通常没有明显的理由。 在这个例子中,我很想重构第二个构造函数,如下所示:

  public Student(int id, String name){ this( id, name, 0.0 ); } 

有2个构造函数,因为它显示了构造函数重载的概念:

拥有多个构造函数(相同的名称和返回类型(构造函数具有类型作为其默认返回类型))但具有不同的参数(不同的签名)

重载构造函数或方法的参数可以在参数的类型和数量 ……甚至序列中变化

你创建的类/对象的实例在创建时调用构造函数。所以那时你可以提供2或3个参数,具体取决于你想要使用的构造函数。如果你提供3它使用3参数构造函数..和2个参数然后它使用2参数构造函数

基本上需要有时提供gpa或有时不提供…因此初始化具有不同值的对象。

构造函数被重载(具有不同参数的相同名称和返回类型,即不同的签名),以便您可以以不同方式启动类的实例。 一个是您选择的GPA,另一个是默认GPA 0.0

它有2个构造函数,因此您可以创建一个类似的学生

 Student s = new Student(1, "Bob"); 

要么

 Student s = new Student(1, "Bob", 4.0); 

如前所述,这称为构造函数重载。 它类似于函数重载,因为你可以使用两个具有相同名称但不同签名的函数来执行不同的操作。

在此示例中,不提供GPA将其设置为0.0(可能稍后更改)。 可能的情况是,某些未来的方法取决于定义的GPA值,并且这两个构造函数实现了这一点。

让我们假设学生升级有类似gpa的要求,在添加学生时应该存在,在这种情况下你将创建

 Student s = new Student(5,"stud1",4.0); 

让我们假设一些课程促销在推广时不需要gpa,那么你的学生对象将是Student s= new Student(6,"stud2"); 这种隐瞒使得学生gpa成为零。