看下面的程序:
class Person {
private String name;//姓名
private String sex;//性别
public Person(String x, String y) {
this.name = x;
this.sex = y;
}
public void setStatus(String x, String y) {
this.name = x;
this.sex = y;
}
public String toString() {
return name + sex;
}
// -----交换普通对象-----
public static void changeref(Person tmpx, Person tmpy) {
//交换tmpx和tmpy对象
Person swapref = tmpx;
tmpx = tmpy;
tmpy = swapref;
// System.out.println("在方法中交换的结果: refa =" + tmpx.toString());
// System.out.println("在方法中交换的结果: refb =" + tmpy.toString());
}
// ----- 交换数组对象-----
public static void changeArrayRef(Person[] x, Person[] y) {
//交换数组对象
Person swaparrayref = x[x.length-1];
x[x.length-1] =y[x.length-1];
y[x.length-1] = swaparrayref;
}
//-----交换数组-----
public static void changeArray(int[] x,int[] y) {
int[] tmp =x;
x = y;
y = tmp;
}
}
public class Demo {
public static void main(String[] args) {
//-------建立并构造两个对象---------
Person refa = new Person("张三", "男");
Person refb = new Person("李四", "男");
//交换refa对象和refb对象
Person.changeref(refa, refb);
//从交换结果中看出,实际对象并未交换
System.out.println("在主函数中交换的结果 refa = " + refa.toString());
System.out.println("在主函数中交换的结果 refb = " + refb.toString());
//-------建立两个对象数组----------
Person[] arraya = new Person[1];
Person[] arrayb = new Person[1];
//分别构造数组对象
arraya[0] = new Person("王五","男");
arrayb[0] = new Person("赵六","男");
/*数组对象为null时,不能设置其值,必须先构造它(即调用构造函数),再用其它方法设置其值
*/
System.out.println('n'+"数组对象交换前的结果 arraya = " + arraya[0].toString());
System.out.println("数组对象交换前的结果 arrayb = " + arrayb[0].toString());
//交换这两个数组对象
Person.changeArrayRef(arraya, arrayb);
System.out.println("-交换后的结果 arraya = " + arraya[0].toString());
System.out.println("-交换后的结果 arrayb = " + arrayb[0].toString());
//-------建立两个普通数组---------
int[] a = new int[2];
int[] b = new int[2];
//给数组个元素赋值
for(int i =0;i
b[i] = i+1;
}
System.out.println('n'+"数组交换前 inta[0] = " + a[0]);
System.out.println("数组交换前 intb[0] = " + b[0]);
//交换数组
Person.changeArray(a,b);
System.out.println("-交换后的结果 inta[0] = " + a[0]);
System.out.println("-交换后的结果 intb[0] = " + b[0]);
}
}
从程序执行的结果来看:在交换两个对象时,仅仅改变了对象句柄的指向,而没有改变对象内容,因此方法参数为对象时,并不交换实际内容,而是交换了拷贝内容。
数组对象有点奇怪,在形参中交换了,实参也反应出来。
数组和普通数据类型一样,形参的改变,不会反应到实参中来。
对象也一样,形参改变了,实参一样不会反应出来。
小结一下:
1、方法可以修改对象参数的状态
2、方法不能让对象参数指向新的对象
3、方法不能修改基本类型(int、byte等)的参数
因此要想交换对象,在方法体中是不现实的,用Clone才能完成……未完,待续…………
Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd 很多书籍都说Java支持传引用调用的方式,类似于C++中的Person &a引用调用,而近来编程遇到一系列问题让我对此产生了怀疑,于是将这些方法一一列出,我们来一起看看JAVA中的调用方式:
看下面的程序:
class Person {
private String na
标签: