英文:
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 Student
s 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);
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论