2017-05-06 76 views
1

我想了解java類和對象的關係,但面臨一個問題。邏輯無法理解

這裏我有一個簡單的Java bean類:

public class Student { 

    int id; 
    String name; 
    String marks; 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

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

    public String getMarks() { 
     return marks; 
    } 

    public void setMarks(String marks) { 
     this.marks = marks; 
    } 

} 

和一個編輯器類:

public class EditStudent { 

    public static void editStd(Student st){ 

     st.setId(10); 
     st.setName("editAbleName"); 
     st.setMarks("133"); 


     // return st; 
    } 

我寫這個邏輯學生對象在我的程序類:

public class TestProgram { 

    public static void main(String args[]){ 
     System.out.println("main"); 

     Student std = new Student(); 
     std.setId(1); 
     std.setName("zeeshan"); 
     std.setMarks("44"); 

     EditStudent.editStd(std); 

     System.out.println("id " +std.getId()); 
     System.out.println("name " +std.getName()); 
     System.out.println("marks " +std.getMarks()); 


    } 
} 

輸出:

main 
id 10 
name editAbleName 
marks 133 

我想我會得到我在我的測試程序類上設置的對象的輸出值,但獲得了我在我的EditStudent類上設置的輸出值。 爲什麼會發生這種情況,即使我認爲我的std對象和editStudent類之間沒有關係? 請解釋一下邏輯發生在這個邏輯和過程之後!

+1

因爲EditStudent修改通過引用的對象的值的參數。 –

+2

'std'是**不是**對象。它是對象的引用。請參閱[Java是否爲「通過引用傳遞」或「按值傳遞」?](http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-價值) –

+0

它的一點點幫助,但需要更清楚地探索 –

回答

1

EditStudent.editStd(std); - 即使您在editStd方法中傳遞std的修改對象,editStd會再次使用方法中的值修改std對象。這是因爲std和s對象引用了堆上的同一個對象。

+0

謝謝Ankita Vashist。 –

0

您的EditStudent類將通過您所做的學生類(st)的參數繼承。您不需要在EditStudent類中定義基類(學生)的值。你的testprogram類是正確的,那麼它將覆蓋EditStudent類的值,你將得到你的派生類的輸出(testprogram)。所以刪除EditStudent類的值。

2

std不是對象。它是一個參考到一個對象。所以,當您將它傳遞給方法editStd時,您將參考傳遞給對象。

因此,stdst指代相同的對象(如它們存儲相同的附圖)因此,爲了通過st指向的對象的任何變化,也反映在std,因爲它們是相同的。

+1

很好的解釋! –

0

您正在傳遞對象的引用。

在編輯學生

EditStudent.editStd(std); // In java It is a reference 
    // IN C++ You used to write '&' in your method(function) 
    but in Java it is not like that. Java doesn't have pointers --> either 

既然你是新的,我會告訴你怎麼寫的類正確

public class Student { 
     // Make them PRIVATE 
private int id; 
private String name; 
private String marks; 

    // create constructor 
     Student(){} // empty 
     Student(int id, String name, Strings marks){ 
     this.id = id; 
     this.marks = marks; 
     this.name = name;} // overloaded, If you want 

//使用getter和setter僅供私人領域..不需要公共

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

public String getName() { 
    return name; 
} 

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

public String getMarks() { 
    return marks; 
} 

public void setMarks(String marks) { 
    this.marks = marks; 
} 

}

效益重載的構造 公共類TestProgram的{

public static void main(String args[]){ 
    System.out.println("main"); 

/* Student std = new Student(); 
    std.setId(1); 
    std.setName("zeeshan"); 
    std.setMarks("44"); */ 

// benefit of overloaded constructor 
     Student s = new Student(1,"zeeshan", 44); 
     // you only need one line 

// EditStudent.editStd(std);  // Here you are passing the reference to your object to another class.. Which changes the original 

// If you want to edit student Make a method in Student class 
// I am following your logic 
    // create an empty student and pass it. 
    Student s2 = EditStudent.editStd( new Student()); 
      // return the student from editstd goto method it is below 
    System.out.println("id " +std.getId()); 
    System.out.println("name " +std.getName()); 
    System.out.println("marks " +std.getMarks()); 


} 

}

public class EditStudent { 

    public static Student editStd(Student st){ 
     // return type student 
     st.setId(10); 
     st.setName("editAbleName"); 
     st.setMarks("133"); 


     return st; 
    } 
+0

謝謝Rohaitas對這個很好的解釋! –

+0

歡迎您! – Rohaitas