很多书籍都说Java支持传引用调用的方式类似于C++中的Person &a引用调用而近来编程遇到一系列问题让我对此产生了怀疑于是将这些方法一一列出我们来一起看看JAVA中的调用方式
看下面的程序
class Person {
private String name;//姓名
private String sex;//性别
public Person(String x String y) {
thisname = x;
thissex = y;
}
public void setStatus(String x String y) {
thisname = x;
thissex = y;
}
public String toString() {
return name + sex;
}
//-----交换普通对象-----
public static void changeref(Person tmpx Person tmpy) {
//交换tmpx和tmpy对象
Person swapref = tmpx;
tmpx = tmpy;
tmpy = swapref;
//Systemoutprintln(在方法中交换的结果: refa = + tmpxtoString());
//Systemoutprintln(在方法中交换的结果: refb = + tmpytoString());
}
// ----- 交换数组对象-----
public static void changeArrayRef(Person[] x Person[] y) {
//交换数组对象
Person swaparrayref = x[xlength];
x[xlength] =y[xlength];
y[xlength] = swaparrayref;
}
//-----交换数组-----
public static void changeArray(int[] xint[] 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对象
Personchangeref(refa refb);
//从交换结果中看出实际对象并未交换
Systemoutprintln(在主函数中交换的结果 refa = + refatoString());
Systemoutprintln(在主函数中交换的结果 refb = + refbtoString());
//-------建立两个对象数组----------
Person[] arraya = new Person[];
Person[] arrayb = new Person[];
//分别构造数组对象
arraya[] = new Person(王五男);
arrayb[] = new Person(赵六男);
/*数组对象为null时不能设置其值必须先构造它(即调用构造函数)再用其它方法设置其值
*/
Systemoutprintln(\n+数组对象交换前的结果 arraya = + arraya[]toString());
Systemoutprintln(数组对象交换前的结果 arrayb = + arrayb[]toString());
//交换这两个数组对象
PersonchangeArrayRef(arraya arrayb);
Systemoutprintln(-交换后的结果 arraya = + arraya[]toString());
Systemoutprintln(-交换后的结果 arrayb = + arrayb[]toString());
//-------建立两个普通数组---------
int[] a = new int[];
int[] b = new int[];
//给数组个元素赋值
for(int i =;ia[i] = i;
b[i] = i+;
}
Systemoutprintln(\n+数组交换前 inta[] = + a[]);
Systemoutprintln(数组交换前 intb[] = + b[]);
//交换数组
PersonchangeArray(ab);
Systemoutprintln(-交换后的结果 inta[] = + a[]);
Systemoutprintln(-交换后的结果 intb[] = + b[]);
}
}
从程序执行的结果来看在交换两个对象时仅仅改变了对象句柄的指向而没有改变对象内容因此方法参数为对象时并不交换实际内容而是交换了拷贝内容
数组对象有点奇怪在形参中交换了实参也反应出来
数组和普通数据类型一样形参的改变不会反应到实参中来
对象也一样形参改变了实参一样不会反应出来
小结一下
方法可以修改对象参数的状态
方法不能让对象参数指向新的对象
方法不能修改基本类型(intbyte等)的参数
因此要想交换对象在方法体中是不现实的用Clone才能完成……未完待续…………