您的位置:首页 > 编程语言 > Java开发

java 传值与传引用小例子

2017-09-11 15:37 190 查看

java 传值与传引用小例子

java传值、传引用傻傻分不清,今天写了一个小例子,实践一下加深印象。

先上结论:

首先不管传啥,java都是传的副本

对于基本类型变量 (int、long、double、float、byte、boolean、char),java传值的副本(相当于影分身之术)

对于对象型变量(对象、数组),java传引用的副本(相当于仓库钥匙复制一份,但指向的还是仓库本身)

/*
* 传值与传引用小例子
* ps:这个小例子用到了重载
* @author: lijialin
*
*/
public class Main {

/*
* x是int,int是基本型
* 对于基本型,java传值的副本,即使副本改变,自己依然不变
* 相当于影分身之术
* 所以,x只是在方法的内部改变了,不影响方法外的x值
*/
static void change(int x) {
++x;
}

/*
* 对于数组类型,传引用的副本,引用的副本也是指向自己的
* 相当于把钥匙复制了一份,传到方法里。然后方法体根据钥匙打开仓库,修改仓库里的值
* 所以,通过引用的副本改变了数组的值,这个改在方法结束后依然有效
*/
static void change(char[] arr) {
arr[0] = 'z';
}

/*
* String有点特殊,在执行str = "aaa"; 时,由于String是final的
* 因此需要jvm重现创建一个值是"aaa"String对象
* 然后把这个对象的引用赋值给str
* 相当于让str重新向"aaa"
* 当方法结束,str的作用消失,依旧指向原来的字符串
*/
static void change(String str) {
str = "aaa";
}

/*
* 对于StringBuilder类型,传递引用的副本
* 另外,StringBuilder产生一块内存空间,对它的增、删、该
* 都在这块内存中进行
*/
static void change(StringBuilder sb) {
sb.append("aaa");
}

public static void main(String[] args) {

// Test1
int x = 0;
change(x);
System.out.println(x);

// Test2
char[] arr = {'a','b','c'};
change(arr);
System.out.println(arr);

// Test3
String s = "abc";
change(s);
System.out.println(s);

// Test4
StringBuilder sb = new StringBuilder("abc");
change(sb);
System.out.println(sb);
}

}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: