前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >值传递和引用传递

值传递和引用传递

作者头像
Mister24
发布2018-05-14 10:55:47
1.6K0
发布2018-05-14 10:55:47
举报
文章被收录于专栏:java初学

  java应用程序有且只有一种参数传递机制,即按值传递。

  按值传递:当将一个参数传递给一个函数的时候,函数接收的是原始值的一个副本,因此,如果函数修改了该参数,仅仅修改的是参数的副本,而原始值保持不变。按引用传递一位置当一个参数传递给一个函数的时候,函数接收的是原始值的内存地址,而不是值的副本。因此,如果函数修改了该参数,调用代码中的原始值也随之改变。

  1.对象是按照引用传递;

  2.java中仅存在一种参数传递机制,即按值传递;

  3.按值传递意味着当一个参数传递给一个函数的时候,函数接收的是原始值的一个副本;

  4.按引用传递意味着当将一个参数传递给一个函数的时候,函数接收的是原始值的内存地址,而不是值的副本。

1.引用传递的例子

代码语言:javascript
复制
package PassTest;

public class Test1
{
	public static void main(String[] args)
	{
		StringBuffer s1 = new StringBuffer("good");
		StringBuffer s2 = s1;
		s2.append(" afternoon.");
		System.out.println(s1);
	}

}

输出结果:

代码语言:javascript
复制
good afternoon.

  对象s1和s2都指向内存中的同一个地址,则指向的是同一个对象。虽然这里看做的是“引用传递”,

但引用传递其实也是传值,因为对象就是一个指针,这个赋值是在指针之间的赋值,因此在java中将它称为传引用。

2.值传递的例子

代码语言:javascript
复制
package PassTest;

public class Test2 
{
	public static void main(String[] args)
	{
		int i1 = 5;
		int i2 = i1;
		i2 = 6;
		System.out.println(i1);
	}

}

输出结果:

代码语言:javascript
复制
5

  由于i1和i2是原始数据类型,而原始数据类型是按值传递,所以修改的其实只是原始值的一个副本,原始值并不会改变。

代码语言:javascript
复制
package PassTest;

public class Test3 
{
	public static void main(String[] args)
	{
		StringBuffer s1 = new StringBuffer("good");
		StringBuffer s2 = new StringBuffer("bad");
		test(s1, s2);
		System.out.println(s1);//9
		System.out.println(s2);//10
	}
	
	static void test(StringBuffer s1, StringBuffer s2)
	{
		System.out.println(s1);//1
		System.out.println(s2);//2
		s2 = s1;//3
		s1 = new StringBuffer("new");//4
		System.out.println(s1);//5
		System.out.println(s2);//6
		s1.append("haha");//7
		s2.append("haha");//8
	}

}

输出结果:

代码语言:javascript
复制
good
bad
new
good
goodhaha
bad

分析:

  1和2比较容易明白,3使得s2指向s1,这时候s2指向的值为“good”,而4使得s指向“new”,所以在5和6的时候输出的结果是new和good。而7使得new变为了newhaha,8使得good变成了goodhaha。再看9和10,此时由于9中的s对应的是good,在test函数中被修改为了goodhaha,所以输出了goodhaha,而10中的s2指向的bad在test函数中并没有被改变,所以输出的是bad。

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档