Java值传递和引用传递基础分析

77 篇文章 12 订阅
69 篇文章 5 订阅



(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/77688416冷血之心的博客)


        一年前我总结过一篇博客:Java基础之引用(String,char[],Integer)总结于牛客网的专项练习题 这篇博客针对Java中值传递和引用传递举了几个例子,进行了分析。这篇博文将再次举出典型案例一起分析。


1、值传递的案例:

        @Test
	public void method1(){
		int x=0;
		this.change(x);
		System.out.println(x);
	 }
		
	 void change(int i){
		i=7;
	}
这毫无疑问输出是0


2、请说出以下代码的正确输出:

@Test
public void method1() {
	StringBuffer x = new StringBuffer("Hello");
	this.change(x);
	System.out.println(x);
}

void change(StringBuffer i) {
	i.append(" world!");
}


这段代码的输出是:Hello world!

为什么?答案见下图:(哈哈,画的是丑了点哈~)第二个图是调用函数时出现的,函数change中所做的操作如图3所示,最后输出x时,引用变量指向的堆中发生了变化。所以输出为:Hello world!

3、请问下边代码的输出结果是什么?

@Test
public void method2() {
	StringBuffer x = new StringBuffer("Hello");
	change2(x);
	System.out.println(x);
}
void change2(StringBuffer i) {
	i = new StringBuffer("hi");
	i.append(" world!");
}

输出结果是:Hello,我们通过画图来分析分析究竟发生了什么?

由图可以看出来,在函数change2中将引用变量i重新指向了堆内存中另一块区域,下边都是对另一块区域进行修改,所以输出是Hello


4、接下来这道题,请大家给出答案?代码如下:

public class Main {
	public static void main(String[] args) {
		StringBuffer sb = new StringBuffer("Hello ");
		System.out.println("Before change, sb = " + sb);
		changeData(sb);
		System.out.println("After change Data(n), sb = " + sb);
	}

	public static void changeData(StringBuffer strBuf) {
		StringBuffer sb2 = new StringBuffer("Hi ");
		strBuf = sb2;
		sb2.append("World!");
	}
}

正确答案为:????

如果大家已经掌握了上边我画图的精髓,应该可以得出正确答案哦~



如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,可以进群366533258一起交流学习哦~


本群给大家提供一个学习交流的平台,内设菜鸟Java管理员一枚、精通算法的金牌讲师一枚、Android管理员一枚、蓝牙BlueTooth管理员一枚、Web前端管理一枚以及C#管理一枚。欢迎大家进来交流技术。



  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

温柔狠角色

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值