Java中对象调用机制
2016-02-01 20:01
531 查看
Java属于面向对象的编程语言,这也给大家造成了一定的误区,在此说明
java对对象采用的是值传递而非对象传递
也就是说,以对象作为参数的方法,只能修改对象的参数即内容,无法修改对象存储的位置
举个例子
上述代码的运行结果是:
![](https://img-blog.csdn.net/20160201192124619?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
可以看到,swap1方法没有实现两个对象的交换,而swap2方法实现了两个对象的交换,
原因如下:
过程分析:
1,首先new出来的对象
person1指向的值为name=Angel,age=22
person2指向的值为name=banan,age=44;
2,在调用swap1方法时,拷贝出了两个对象
person1指向的值为name=Angel,age=22
person2指向的值为name=banan,age=44;
copyperson1指向的值为name=Angel,age=22
copyperson2指向的值为name=banan,age=44;
3,在swap1方法内部进行了交换,即此时内部对象 的值为
person1指向的值为name=Angel,age=22
person2指向的值为name=banan,age=44;
copyperson1指向的值为name=banan,age=44
copyperson2指向的值为name=Angel,age=22;
只是说被拷贝的对象进行了交换,但是并未改变原来的对象, 而在方法结束后,拷贝的对象被释放掉了
4,在调用swap2方法时,是说,对拷贝的对象所指向的值进行了更改,因为拷贝的对象和原来的对象所指向的为同一块存储区域,即执行swap2方法时存储区域里的内容发生了改变,也就是说原来的对象所指向的存储区域内容发生改变了,所以,swap2可以实现交换两个对象内容,但swap1却不可以,具体如下图所示
![](https://img-blog.csdn.net/20160201200503379?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
‘
其实这是说明了java面向对象的机制,你在调用swap1时,只是简单的在栈里添加了一个对对象的引用,当方法结束后,所添加的引用跟着消失。而在调用swap2方法时是在修改对象的引用所指向的对象里的内容。
对于对象和对象引用的关系可参考
面试必备:String,StringBuffer,StringBuilder区别
’
java对对象采用的是值传递而非对象传递
也就是说,以对象作为参数的方法,只能修改对象的参数即内容,无法修改对象存储的位置
举个例子
public class SwapObject { private static Person person1; private static Person person2; public static void main(String[] args) { person1 = new Person("Angel", "22"); person2 = new Person("banan","44"); System.out.println("---打印出person1和person2的初始值---"); System.out.println("person1:"+person1+",person2"+person2); System.out.println(); swap1(person1, person2); System.out.println("---swap1方法结束后---"); System.out.println("person1:"+person1+",person2"+person2); System.out.println(); swap2(person1, person2); System.out.println("---swap2方法结束后---"); System.out.println("person1:"+person1+",person2"+person2); } /** * 交换两个对象 * @param person1 * @param person2 */ private static void swap1(Person person1,Person person2){ Person temp = person1; person1 = person2; person2 = temp; System.out.println("---调用swap1方法内部---"); System.out.println("person1:"+person1+",person2"+person2); System.out.println(); } /** * 交换两个对象的内容 * @param person1 * @param person2 */ private static void swap2(Person person1,Person person2){ String tempName = person1.name; String tempAge = person1.age; person1.name = person2.name; person1.age = person2.age; person2.name = tempName; person2.age = tempAge; System.out.println("---调用swap2方法内部---"); System.out.println("person1:"+person1+",person2"+person2); System.out.println(); } }
上述代码的运行结果是:
可以看到,swap1方法没有实现两个对象的交换,而swap2方法实现了两个对象的交换,
原因如下:
过程分析:
1,首先new出来的对象
person1指向的值为name=Angel,age=22
person2指向的值为name=banan,age=44;
2,在调用swap1方法时,拷贝出了两个对象
person1指向的值为name=Angel,age=22
person2指向的值为name=banan,age=44;
copyperson1指向的值为name=Angel,age=22
copyperson2指向的值为name=banan,age=44;
3,在swap1方法内部进行了交换,即此时内部对象 的值为
person1指向的值为name=Angel,age=22
person2指向的值为name=banan,age=44;
copyperson1指向的值为name=banan,age=44
copyperson2指向的值为name=Angel,age=22;
只是说被拷贝的对象进行了交换,但是并未改变原来的对象, 而在方法结束后,拷贝的对象被释放掉了
4,在调用swap2方法时,是说,对拷贝的对象所指向的值进行了更改,因为拷贝的对象和原来的对象所指向的为同一块存储区域,即执行swap2方法时存储区域里的内容发生了改变,也就是说原来的对象所指向的存储区域内容发生改变了,所以,swap2可以实现交换两个对象内容,但swap1却不可以,具体如下图所示
‘
其实这是说明了java面向对象的机制,你在调用swap1时,只是简单的在栈里添加了一个对对象的引用,当方法结束后,所添加的引用跟着消失。而在调用swap2方法时是在修改对象的引用所指向的对象里的内容。
对于对象和对象引用的关系可参考
面试必备:String,StringBuffer,StringBuilder区别
’
相关文章推荐
- 如何在eclipse中配置arm交叉编译环境
- 本地方法(JNI)——访问域+字符串参数
- JAVA环境变量配置
- spring(基础11) Spring 工具类AntPathMatcher
- 【慕课笔记】U2 封装 第5节 什么是JAVA中的内部类
- JAVA的Random类(转)
- 【慕课笔记】U2 封装 第4节 JAVA中的this关键字
- JAVA中的接口
- Java 判断字符串中是否包含中文
- JAVA-接口
- 【Maven由浅入深】4.在Eclipse中建立简单的项目1
- javaweb异常提示信息统一处理(使用springmvc,附源码)
- javaweb异常提示信息统一处理(使用springmvc,附源码)
- javaweb异常提示信息统一处理(使用springmvc,附源码)
- Java 获取请求主机IP地址
- javaweb异常提示信息统一处理(使用springmvc,附源码)
- javac java在mac console中文乱码的问题
- Java环境的配置
- Java Web 三大框架开发资料
- java保存log到文件中