(尊重劳动成果,转载请注明出处: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#管理一枚。欢迎大家进来交流技术。