java值传递详解
java的值传递详解
- 首先我们需要弄清楚基本数据类型和引用数据类型的区别
int num = 0;
String str = "java";
基本数据类型直接保存在变量中,而引用数据类型保存在变量中的是地址值,地址指向实际对象,所以被称为引用数据类型。
2. 再来弄清楚赋值运算符(=)的作用
num = 20;
str = "hello";
基本数据类型直接修改变量中存储的数值,而应用数据类型是修改了变量中保存的地址,新地址指向所赋值的实际对象,原来的对象并没有改变。没有任何地址指向的对象就是垃圾会被java垃圾回收机制回收
3. 值传递实际例子
//第一个例子:基本类型
void foo(int value) {
value = 100;
}
foo(num); // num 没有被改变
//第二个例子:没有提供改变自身方法的引用类型
void foo(String text) {
text = "windows";
}
foo(str); // str 也没有被改变
//第三个例子:提供了改变自身方法的引用类型
StringBuilder sb = new StringBuilder("iphone");
void foo(StringBuilder builder) {
builder.append("4");
}
foo(sb); // sb 被改变了,变成了"iphone4"。
//第四个例子:提供了改变自身方法的引用类型,但是不使用,而是使用赋值运算符。
StringBuilder sb = new StringBuilder("iphone");
void foo(StringBuilder builder) {
builder = new StringBuilder("ipad");
}
foo(sb); // sb 没有被改变,还是 "iphone"。
第一个例子,对于基本数据类型来说,因为是值传递,将num的值赋给形参value,所以num并不会改变。
第二个例子,对于引用数据类型来说,将str的地址赋值给text,函数中改变的是text的地址值,所以str没有变换。
第三个例子,在函数中sb的地址赋值给形参builder,builder的地址没有变化,而实际对象"iphone"被修改成”iphone4“,所以sb地址指向的值从”iphone“变成了”iphone4“。
第四个例子,在函数中sb的地址赋值给形参builder,而builder的地址发生变化,原来的实际对象i并没有发生改变,因此sb没有改变,依旧指向”iphone“。