繁体   English   中英

逻辑无法理解

[英]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。

因此, stdst引用相同的对象( 因为它们存储相同的引用 )因此,对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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM