我知道Java类实例是通过引用传递的。我试图交换两个类实例,但它没有奏效。我不明白,如果他们通过引用传递,那么代码应该有效。我在这里缺少什么?
public class Swapper {
public static void main(String[] args) {
NormalClass na = new NormalClass(1235);
NormalClass nb = new NormalClass(5468);
System.out.println("Before: 1st Object -->");
na.print_obj();
System.out.println("Before: 2nd Object -->");
nb.print_obj();
NormalClass.swap(na,nb);
System.out.println("After: 1st Object -->");
na.print_obj();
System.out.println("After: 2nd Object -->");
nb.print_obj();
}
}
class NormalClass{
public int _ID;
public static void swap(NormalClass a, NormalClass b){
NormalClass temp;
temp = a;
a = b;
b = temp;
}
public void print_obj(){
System.out.println(this._ID);
}
NormalClass(int __id){
this._ID = __id;
}
}
答案 0 :(得分:6)
我知道Java类实例是通过引用传递的
首先,您不会传递实例,而是引用它们。引用按值传递。
在您的方法中,您传递了对两个实例的引用,这两个实例创建了两个实例的副本。然后你交换了那些引用的副本。由于它们是按值传递的,因此不会影响原始引用,从而影响行为。仅供参考,Java中的所有内容都按值传递。
答案 1 :(得分:2)
您无法直接更新来电者参考。要进行这种交换,您可以传入一个数组。另外,我会覆盖toString()
进行打印 -
public int _ID;
public static void swap(NormalClass[] arr) {
NormalClass temp = arr[0];
arr[0] = arr[1];
arr[1] = temp;
}
@Override
public String toString() {
return String.valueOf(this._ID);
}
NormalClass(int __id) {
this._ID = __id;
}
public static void main(String[] args) {
NormalClass[] arr = new NormalClass[] { new NormalClass(1235),
new NormalClass(5468) };
System.out.println("Before: 1st Object -->");
System.out.println(arr[0]);
System.out.println("Before: 2nd Object -->");
System.out.println(arr[1]);
NormalClass.swap(arr);
System.out.println("After: 1st Object -->");
System.out.println(arr[0]);
System.out.println("After: 2nd Object -->");
System.out.println(arr[1]);
}
输出
Before: 1st Object -->
1235
Before: 2nd Object -->
5468
After: 1st Object -->
5468
After: 2nd Object -->
1235