java中只有值传递,没有引用传递
形参:方法列表中的参数
实参:调用方法时实际传入到方法列表的参数(实参在传递之前必须初始化)
值传递:传递的是实参的副本(更准确的说是实参引用的副本,因为形参接受的是对象的引用)
引用传递:传递的是内存地址
public static void main(String[] args) {
// 实参
int num = 1;
// num 没有被改变 基本类型存储在栈里面,main方法栈里有一个num = 1,foo方法栈里存了一个副本num = 1;后来foo栈里面的改成了100,不会影响main方法中的
foo(num);
String str = "ABC";
foo(str); // str 也没有被改变
StringBuilder sb1 = new StringBuilder("iphone");
foo1(sb1); // sb 被改变了,变成了"iphone4"。
/*
* main方法栈有有个sb2 指向堆中的StringBuilder("iphone")对象
* 将main栈中的sb2的副本传递给foo2中的形参builder,builder指向堆中的StringBuilder("iphone")对象(与main是同一个对象)
* foo2栈中的builder指向StringBuilder("ipad")对象
* main栈中的sb2不会受影响
* 如果是引用传递main中的sb2会收到影响
*/
StringBuilder sb2 = new StringBuilder("iphone");
foo2(sb2); // sb 没有被改变,还是 "iphone"
System.out.println("num:" + num);//num:1
System.out.println("str:" + str);//str:ABC
System.out.println("sb1:" + sb1.toString());//sb1:iphone4
System.out.println("sb2:" + sb2.toString());//sb2:iphone
}
//第一个例子:基本类型 value为形参
static void foo(int value) {
value = 100;
}
//第二个例子:没有提供改变自身方法的引用类型
static void foo(String text) {
text = "windows";
}
/*
* 是否说明java支持引用传递呢? 不支持
* StringBuilder builder传递的仅仅是builder本身的值(即实参引用的副本)
*/
static void foo1(StringBuilder builder) {
builder.append("4");
}
//第四个例子:提供了改变自身方法的引用类型,但是不使用,而是使用赋值运算符。
static void foo2(StringBuilder builder) {
builder = new StringBuilder("ipad");
}