【问题标题】:Why does this class have two constructors?为什么这个类有两个构造函数?
【发布时间】:2012-02-10 04:28:02
【问题描述】:

我在旨在说明构造函数的幻灯片中看到了这一点。我现在很困惑,因为它有两个具有相同工作的构造函数接受在第二个构造函数中将 gpa 设置为零。为什么编码器需要再次重复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); } - 否则您的代码更改必须发生两次,这很糟糕!

标签: java class methods constructor


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    重载的构造函数或方法的参数可以在参数的类型和数量...甚至顺序上有所不同

    您创建的类/对象的实例在创建时调用构造函数。 所以当时你可以根据你想使用的构造函数提供 2 或 3 个参数。 如果你提供 3 它使用 3 参数构造函数..和 2 参数然后它使用 2 参数构造函数

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        它有 2 个构造函数,所以你可以创建一个 Student 类

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

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

            假设学生晋升有要求,例如在添加学生时应该存在 gpa,在这种情况下,您将创建

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

            让我们假设某些班级晋升在晋升时不需要 gpa,那么您的学生对象将是 Student s= new Student(6,"stud2");,这会将学生 gpa 隐式设置为零。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-12-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多