【问题标题】:Using multiple constructors with one object in Java在 Java 中对一个对象使用多个构造函数
【发布时间】:2015-01-05 13:09:20
【问题描述】:

我有两个 Student 构造函数,我试图将它们都用于一个对象。但我应该做错了,因为我的输出不是我所期望的。

输出: 学校:无 年级:0 意向专业:null

学生的身份证号码是:154324 学生姓名:山姆湾 学生GPA:3.56

类定义代码:

public class Student
{
   private int id, gradeLevel;
   private String name, school, major;
   private double gpa;


   //constructor to initialize the instance variables of student object
   public Student(int id, String name, double gpa)
   {
      this.id = id;
      this.name = name;
      this.gpa = gpa;
   }

   public Student(int gradeLevel, String school, String major)
   {
      this.gradeLevel = gradeLevel;
      this.school = school;
      this.major = major;
   }    

   //toString() to display the attributions of the student object
   public String toString()
   {
      return "School: " + school +
             "\nGrade Level: " + gradeLevel +
             "\nIntended Major: " + major + "\n" +
             "\nStudent's ID number is: " + id +
             "\nStudent's name: " + name +
             "\nStudent's GPA: " + gpa;
   }

}//end class             

主代码:

public class StudentDrive

    {
       public static void main(String [] args)
       {
      //creating student objects
      Student sam = new Student(12, "Alpha High School", "Biology");
      sam = new Student(154324, "Sam Bay", 3.56);

      System.out.println(sam);

   }
}   

似乎我已经初始化了第一部分,但我得到了 null 和 0??!!!

【问题讨论】:

  • 当您创建全新的第二个对象时,您在第一个对象创建中输入的信息会丢失。我的问题是你为什么要这样做?
  • 无论如何,你只会初始化一半你想要的变量。有一种更好的方法可以做到这一点,但这取决于你想走哪条路;您对一个巨大的建造者感到满意,还是对建造者更开放?
  • 查看this thread 了解相同的问题。

标签: java


【解决方案1】:

你不能在一个对象上同时使用两个构造函数。

在您的代码中:

Student sam = new Student(12, "Alpha High School", "Biology");

创建一个新的Student 对象并将其引用分配给变量sam

在你的下一行:

sam = new Student(154324, "Sam Bay", 3.56);

这会创建 另一个 Student 对象,与第一个对象分开,并重新分配 sam 来引用它。在此过程中,您最终会孤立原始 Student 并将其留给垃圾回收。

您真正想要做的是通过单个构造函数传递Student 所需的所有数据,提供getter/setter(例如setGradeLevel(int level) ) 和一层异常阻止方法访问Student 对象,直到所有字段都填满。第一个选项通常更可靠。

例如,一个完整的构造函数看起来像这样(为便于阅读而格式化):

public Student(int id, int gradeLevel, String name, 
               String school, String major, double gpa)
{
    // fill your fields in here
}

【讨论】:

    【解决方案2】:

    我认为您应该再次阅读 constructor 的文档;)

    Student sam = new Student(12, "Oakton High School", "Biology"); 您正在使用给定参数创建一个学生对象并将其存储在变量 sam 中。

    当您调用sam = new Student(154324, "Sam Bay", 3.56); 时,您将再次创建一个 学生对象并将其存储在sam 中。您不是在修改第一个对象,而是丢弃它并创建一个新对象。

    您应该尝试向 Student 对象添加一个方法,例如:

    public void setAdditionalValues(int id, String name, double gpa){
        this.id = id;
        this.name = name;
        this.gpa = gpa;
    }
    

    希望这有帮助:)

    编辑:如前所述,您还可以使用一个构造函数来获取所有参数或为学生对象的每个属性实现设置器,如下所示:

    public void setName(String name){
        this.name = name;
    }
    

    【讨论】:

      猜你喜欢
      • 2023-02-10
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      相关资源
      最近更新 更多