个人理解,可能会有错误之处,请仔细甄别,谨慎参考!如有错误或不同见解请指出!
值传递(Pass By Value或者Call By Value)是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量。一般java中的基础类型数据传递都是值传递。
引用传递(Pass By Reference或者Call By Reference)一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。一般java中实例(包装)对象的传递是引用传递。
一、基本类型和引用类型在内存中的不同之处
int num = 10;
String str = "hello";
如图所示,num是基本类型,值就直接保存在变量中。而str是引用类型,变量中保存的只是实际对象的地址。一般称这种变量为"引用",引用指向实际对象,实际对象中保存着内容。
二、赋值时内存的变化
int num = 24;
String str = "world";
对于基本类型num,赋值运算符会直接改变变量的值,原来的值被覆盖掉。对于引用类型str,赋值运算符会改变引用中所保存的地址,原来的地址被覆盖掉。但是原来的对象(“hello” 字符串对象)不会被改变。(没有被任何引用所指向的对象是垃圾,会被垃圾回收器回收)
三、调用方法时发生了什么,参数传递基本上就是赋值操作
第一个例子:基本类型
void change(int value) {
value = 100;
}
change(num); // num 没有被改变
第二个例子:引用类型没有使用改变自身方法的方法
void change(String a) {
a = "唐";
}
change(str); // str没有被改变
或:
StringBuilder stri = new StringBuilder("唐");
void change(StringBuilder builder) {
builder = new StringBuilder("宋");
}
change(stri); // stri没有被改变,还是 "唐"。
第三个例子:引用类型使用了改变自身方法的方法
StringBuilder stri = new StringBuilder("明");
void change(StringBuilder builder) {
builder.append("清");
}
change(stri); // stri被改变了,变成了"清"。
第三个例子的图解:
builder.append("清")之后
参考: