2017-05-06 78 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