2014-11-08 90 views
0

我有兩個構造函數爲學生,我正試圖使用​​一個對象他們兩個。但我應該做錯了,因爲我的輸出不是我所期望的。使用多個構造函數與Java中的一個對象

輸出: 學校:空 年級:0 意向科目:空

學生的身份證號碼是: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); 

    } 
} 

看來我已經初始化了第一部分,但我得到空和0 ?? !!!

+1

當你創建一個全新的第二個對象在第一個對象創建輸入的信息丟失。我的問題是你爲什麼要這樣做? – csmckelvey 2014-11-08 23:44:27

+0

無論如何,你只會初始化你想要的一半變量。這樣做有一個更好的方法,但這取決於你想要走哪條路;你對一個巨大的構造函數感到滿意嗎,還是對構建者更開放? – Makoto 2014-11-08 23:45:21

+1

請參閱[此主題](http://stackoverflow.com/questions/18999635/how-to-execute-multiple-constructor-when-creating-single-object)相同的問題。 – mattias 2014-11-08 23:46:12

回答

2

您不能在一個對象上同時使用兩個構造函數。

在您的代碼:

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 
} 
+0

明白了!非常感謝你 – PTheCoolGuy 2014-11-09 00:01:20

0

我想你應該通過文檔的constructor再次讀取;)

隨着Student sam = new Student(12, "Oakton High School", "Biology"); 要創建一個以學生爲對象具有給定參數並將其存儲在變量SAM。

當您致電sam = new Student(154324, "Sam Bay", 3.56);時,您將再次創建一個新的學生對象並將其存儲在sam中。您不是修改第一個對象,而是丟棄它並創建一個新對象。

你應該嘗試添加一個方法,以你的學生對象,如:

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

希望這是有益:)

編輯:正如前面提到的,你也可以使用一個構造函數的所有參數或爲這個Student對象的每個屬性實現設置器,如下所示:

public void setName(String name){ 
    this.name = name; 
} 
相關問題