您的位置:首页 > 编程语言 > Java开发

JAVA2核心技术阅读笔记(一)

2007-07-07 15:19 465 查看
第四章里面讨论到JAVA的方法参数到底是值传递还是引用传递, 作者认为JAVA使用的是值传递,而在Thinking in JAVA中关于传递貌似说的是引用传递(我有点记不清了,刚才也没翻到),在网上搜了一下,更是说法纷纭,让人越看越迷糊。没办法,只好自己想办法写例子来实验一下。

先构建一个Person类,有name和age两个字段




public class Person ...{


String name;


int age;






public Person(String name,int age)...{


this.name = name;


this.age = age;


}






public int getAge() ...{


return age;


}




public void setAge(int age) ...{


this.age = age;


}




public String getName() ...{


return name;


}




public void setName(String name) ...{


this.name = name;


}




}



然后再设计一个personSwap方法,传入两个Person对象引用,先对这两个对象引用进行对象交换操作,然后再对两个对象中的name字段值进行交换操作。最后,在main中调用方法。最后生成的结果我都写在了注释中




public class PersonUtil ...{






public static void personSwap(Person a, Person b) ...{




/**//*


* 传入的对象引用,这里指向的对象和在传入前的是一样的


* 打印结果


* ------------------swapbegin------------------


* Person a:Person@11b86e7 name:aaa age:1


* Person b:Person@35ce36 name:bbb age:2


*/


System.out.println("------------------swap begin------------------");


System.out.println("Person a:" + a + " name:" + a.getName() + " age:"


+ a.getAge());


System.out.println("Person b:" + b + " name:" + b.getName() + " age:"


+ b.getAge());


System.out.println();






/**//*


* 开始交换对象


* 打印结果


* ------------------swap reference------------------


* Person a:Person@35ce36 name:bbb age:2


* Person b:Person@11b86e7 name:aaa age:1


*/


System.out


.println("------------------swap reference------------------");


Person tmp1 = a;


a = b;


b = tmp1;


System.out.println("Person a:" + a + " name:" + a.getName() + " age:"


+ a.getAge());


System.out.println("Person b:" + b + " name:" + b.getName() + " age:"


+ b.getAge());


System.out.println();






/**//*


* 交换对象中name字段的值


* 打印结果


* ------------------swap field value------------------


* Person a:Person@35ce36 name:aaa age:2


* Person b:Person@11b86e7 name:bbb age:1


*/


System.out


.println("------------------swap field value------------------");


String tmp2 = a.getName();


a.setName(b.getName());


b.setName(tmp2);


System.out.println("Person a:" + a + " name:" + a.getName() + " age:"


+ a.getAge());


System.out.println("Person b:" + b + " name:" + b.getName() + " age:"


+ b.getAge());


System.out.println();






/**//*


* 交换完成后


* 打印结果


* ------------------swap end------------------


* Persona:Person@35ce36 name:aaa age:2


* Person b:Person@11b86e7 name:bbb age:1


*/


System.out.println("------------------swap end------------------");


System.out.println("Person a:" + a + " name:" + a.getName() + " age:"


+ a.getAge());


System.out.println("Person b:" + b + " name:" + b.getName() + " age:"


+ b.getAge());


System.out.println();


}






public static void main(String[] args) ...{


Person a = new Person("aaa", 1);


Person b = new Person("bbb", 2);






/**//*


* 生成两个对象,对象引用为a、b


* 在交换前的初始数据


* 打印结果


* ------------------before swap------------------


* Person a:Person@11b86e7 name:aaa age:1


* Person b:Person@35ce36 name:bbb age:2


*/


System.out.println("------------------before swap------------------");


System.out.println("Person a:" + a + " name:" + a.getName() + " age:"


+ a.getAge());


System.out.println("Person b:" + b + " name:" + b.getName() + " age:"


+ b.getAge());


System.out.println();




PersonUtil.personSwap(a, b); // 调用方法,进入方法体






/**//*


* 方法调用结束,返回main() 打印结果


* ------------------after swap------------------


* Person a:Person@11b86e7 name:bbb age:1


* Person b:Person@35ce36 name:aaa age:2


*/


System.out.println("------------------after swap------------------");


System.out.println("Person a:" + a + " name:" + a.getName() + " age:"


+ a.getAge());


System.out.println("Person b:" + b + " name:" + b.getName() + " age:"


+ b.getAge());


}




}



其结果很明显,java的对象引用传递并不是直接把引用传递进去的,否则,在离开personSwap方法后,a和b所指向的对象应该对调了才是。应该说,core java2所说的传递引用拷贝是正确的,换言之,JAVA是传值的,它把整一个对象传了进去,因此我们可以对该对象的字段进行操作,但是我们不能改变对象引用所指的对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: