英文:
How to swap object s1 and s3 in attched StudentTest.java file
问题
问题是交换函数应该在main()函数中交换引用,但这并不是这样的情况,原因是Java中参数传递的方式。
在Java中,参数传递是按值传递的,这意味着当你将对象传递给一个方法时,实际上传递的是对象的引用的副本,而不是对象本身。在swap_s1_n_s3方法中,虽然你交换了students数组中两个元素的位置,但是你没有改变main()方法中students数组中的引用。所以,虽然在swap_s1_n_s3方法内部students数组中的元素引用发生了交换,但在main()方法中,s1和s3仍然分别引用原始的Student对象。
简而言之,Java中的参数传递方式导致在swap_s1_n_s3方法内部的交换不会影响main()方法中的引用。如果你想要在main()方法中交换引用,你可以使用一个包装对象或者返回一个新的数组,以便在main()方法中得到交换后的数组。
英文:
Below is a StudentTest class which uses Student.java to create student
Student class
class Student
 {
    int id;
    static int computeCount;
    int age;
    String name;
    String gender;
    short rank;
    double gpa;
    long phone;
    char degree;
    boolean international;
    double tutionfees=12000;
    double internationalFees=5000;
    Student(int id,String name,String gender,int age,long phone,double gpa, char degree){
      // id=newId;
      // name=newName;
      // gender=newGender;
      // age=newAge;
      // phone=newPhone;
      // gpa=newGpa;
      // degree=newDegree;
      this(id,name,gender, age, phone,gpa,degree,false);    // delegate to second parameterized constructor 
      //international=isInternational;
    }
    // Second parameterized constructor
    Student(int id,String name,String gender,int age,long phone,double gpa, char degree,boolean international){
      this.id=id;
      this.name=name;
      this.gender=gender;
      this.age=age;
      this.phone=phone;
      this.gpa=gpa;
      this.degree=degree;
      this.international=international;
}
StudentTest class
class StudentTest {
	 public static void main(String args[])
     {
        Student s1=new Student(1000,"John","Male",18,2234567890L,3.8,'B');
        Student s2=new Student(1001,"Indresh","Male",20,2234567893L,4.0,'C',true);
        Student s3 = new Student(1002,"Anita","Female",25,2234568793L,4.2,'B',true);
        System.out.println("student1: " + s1.name);
        System.out.println("student2: " + s2.name);
        System.out.println("student3: " + s3.name);
        Student[] students={s1,s2,s3};    // object array of Student type
        // Swap s1 and s3 references
        // Before Swap
        System.out.println("\n\nBefore Swap\n--------");
        System.out.println("student1: " + s1.name);
        System.out.println("student2: " + s2.name);
        System.out.println("student3: " + s3.name);
         // After swap
        swap_s1_n_s3(students,0,2);
        System.out.println("\n\nAfter Swap, Inside StudentTest class\n--------");
        System.out.println("\n\nstudent1: " + s1.name);
        System.out.println("student2: " + s2.name);
        System.out.println("student3: " + s3.name);
   }
static void swap_s1_n_s3(Student[] students,int first,int last)
   {    System.out.println("\n\n------------\nINSIDE SWAP METHOD");
        Student s5;
        s5=students[first];
        students[first]=students[last];
        students[last]=s5;
        
          System.out.println("\n\nstudent1: " + students[0].name);
        System.out.println("student2: " + students[1].name);
        System.out.println("student3: " + students[2].name);
        System.out.println("\nEXIT SWAP METHOD");
   }
 }  
OUTPUT
$ java StudentTest
student1: Joan
student2: Indresh
student3: Anita
Before Swap
student1: John
student2: Indresh
student3: Anita
INSIDE SWAP METHOD
student1: Anita
student2: Indresh
student3: John
EXIT SWAP METHOD
After Swap, Inside StudentTest class
student1: John
student2: Indresh
student3: Anita
My question is the swap funtion should also swap the references in main(), but this is not the case, why ?
答案1
得分: 2
交换逻辑正常工作。问题属于不同的性质。
在所呈现的代码中,变量s1、s2和s3用于保存初始的Student对象,初始化students数组并用于调试打印。然而,无论对students做了什么操作,这三个变量始终引用最初分配给它们的同一个Student对象。当变量声明为final时,这一点变得明显。
在调试打印Student对象时,应该通过students数组进行访问:
System.out.println("student1: " + students[0].name);
System.out.println("student2: " + students[1].name);
System.out.println("student3: " + students[2].name);
英文:
The swap-logic works correctly. The problem is of a different nature.
In the code presented, the variables s1, s2 and s3 are used to hold the initial Student-objects, initialize the students-array and printed as debugging. No matter, however, what is done to and with students, these three variables reference the same Student-object that was originally assigned to them. This gets obvious when the variables are declared as final.
When printing the Students for debugging, they should be accessed through the students-array:
System.out.println("student1: " + students[0].name);
System.out.println("student2: " + students[1].name);
System.out.println("student3: " + students[2].name);
答案2
得分: 1
将主方法替换为以下内容,你会有一个想法。
不要通过引用访问元素,而是通过array[index]进行访问,你会得到你想要的确切结果。
public static void main(String args[]) {
    Student s1 = new Student(1000, "John", "Male", 18, 2234567890L, 3.8, 'B');
    Student s2 = new Student(1001, "Indresh", "Male", 20, 2234567893L, 4.0, 'C', true);
    Student s3 = new Student(1002, "Anita", "Female", 25, 2234568793L, 4.2, 'B', true);
    System.out.println("student1: " + s1.name);
    System.out.println("student2: " + s2.name);
    System.out.println("student3: " + s3.name);
    Student[] students = {s1, s2, s3};    // Student类型的对象数组
    // 交换s1和s3的引用
    // 交换之前
    System.out.println("\n\n交换之前\n--------");
    System.out.println("student1: " + s1.name);
    System.out.println("student2: " + s2.name);
    System.out.println("student3: " + s3.name);
    // 交换后
    swap_s1_n_s3(students, 0, 2);
    System.out.println("\n\n交换后,在StudentTest类内部\n--------");
    System.out.println("student1: " + students[0].name);
    System.out.println("student2: " + students[1].name);
    System.out.println("student3: " + students[2].name);
}
英文:
Replace main method as below, you will get an idea.
Instead of accessing element by reference you need to access by array[index], you will get exact result what you want.
 public static void main(String args[]) {
Student s1 = new Student(1000, "John", "Male", 18, 2234567890L, 3.8, 'B');
Student s2 = new Student(1001, "Indresh", "Male", 20, 2234567893L, 4.0, 'C', true);
Student s3 = new Student(1002, "Anita", "Female", 25, 2234568793L, 4.2, 'B', true);
System.out.println("student1: " + s1.name);
System.out.println("student2: " + s2.name);
System.out.println("student3: " + s3.name);
Student[] students = {s1, s2, s3};    // object array of Student type
// Swap s1 and s3 references
// Before Swap
System.out.println("\n\nBefore Swap\n--------");
System.out.println("student1: " + s1.name);
System.out.println("student2: " + s2.name);
System.out.println("student3: " + s3.name);
// After swap
swap_s1_n_s3(students, 0, 2);
System.out.println("\n\nAfter Swap, Inside StudentTest class\n--------");
System.out.println("student1: " + students[0].name);
System.out.println("student2: " +  students[1].name);
System.out.println("student3: " +  students[2].name);
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论