前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java中对象调用机制

Java中对象调用机制

作者头像
fanfan
发布2022-05-07 13:56:28
4140
发布2022-05-07 13:56:28
举报
文章被收录于专栏:编程思想之路编程思想之路

Java属于面向对象的编程语言,这也给大家造成了一定的误区,在此说明

java对对象采用的是值传递而非对象传递

也就是说,以对象作为参数的方法,只能修改对象的参数即内容,无法修改对象存储的位置

举个例子

代码语言:javascript
复制
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区别

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-02-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 面试必备:String,StringBuffer,StringBuilder区别
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档