我有两个Student的构造函数,我试图将它们与一个对象一起使用。但我应该做错了,因为我的输出不是我所期望的。
输出: 学校:null 年级:0 预期专业:null
学生的身份证号码是:154324 学生的名字:Sam Bay 学生的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 ?? !!!
答案 0 :(得分:2)
您不能在单个对象上同时使用两个构造函数。
在您的代码中:
Student sam = new Student(12, "Alpha High School", "Biology");
创建一个新的Student
对象,并将其引用分配给变量sam
。
在下一行:
sam = new Student(154324, "Sam Bay", 3.56);
这会创建另一个 Student
对象,与第一个对象分开,并重新分配sam
以引用它。在此过程中,您最终会将原始Student
孤立,并将其打开以进行垃圾回收。
您真正想做的是通过单个构造函数传递 {/ 1>}所需的所有数据,或提供getter / setter(例如{ {1}})和一层异常,阻止方法访问Student
对象,直到填写完所有字段。第一种选择通常更健全。
例如,一个完整的构造函数看起来像这样(为了可读性而格式化):
setGradeLevel(int level)
答案 1 :(得分:0)
我认为您应该再次阅读constructor的文档;)
Student sam = new Student(12, "Oakton High School", "Biology");
您正在创建具有给定参数的Student对象并将其存储在变量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;
}
希望这有用:)
编辑:如前所述,您还可以使用一个构造函数,它接受所有参数或为Student对象的每个属性实现setter,如下所示:public void setName(String name){
this.name = name;
}