[英]Logic cannot understand
我试图理解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;
}
我正在为我的程序类中的student对象编写这个逻辑:
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
类之间没有任何关系? 请解释一下这个逻辑和过程背后的逻辑!
std
不是Object 。 它是对Object的引用 。 因此,当您将其传递给方法editStd
,您将引用传递给Object。
因此, std
和st
引用相同的对象( 因为它们存储相同的引用 )因此,对st
指向的对象的任何更改也会反映在std
,因为它们是相同的。
EditStudent.editStd(std);
- 即使您在editStd方法中传递std的修改对象,editStd也会再次使用方法中的值修改std对象。 这是因为std和s对象引用堆上的同一个对象。
您的EditStudent类将通过您所创建的学生类(st)的参数继承。 您无需在EditStudent类中定义Base类(student)的值。 你的testprogram类是正确的,然后它将覆盖EditStudent类的值,你将获得派生类(testprogram)的输出。 因此,从EditStudent类中删除值。
您正在传递对象的引用。
在编辑学生
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
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.