String是值传递还是引用传递
首先,大部分情况下,引用存储在栈中,对象存储在堆中,我们通过栈中的引用找到堆中的对象,然后改变对象的值。
-
首先:无论是值传递还是引用传递,实际上都是值传递。
-
基本数据类型:将值复制一份,传入到方法体。
-
引用数据类型:栈中存放内存地址,堆中存放实际的值。我理解为钥匙和门。这里复制的实际是钥匙的值,比如OX123456,在方法体内,如果不new 一个新的对象(新建一个带钥匙的房子)。直接用set方法改变值,改变成功(通过钥匙找到房间,进入房间,改变布局)。
`public static void main(String[] args) { User user = new User(); user.setName("我是用户1号"); changeObject(user); System.out.println("main 结束:"+user.getName()); }
`
static void changeObject(User user){ user.setName("我是用户2号"); // uesr=new User();//这里如果这样写,输出结果就是 无 }
输出结果为:我是用户2号
4.对于string数据类型,方法体内的str=“hello”,就相当于str=new String(“hello”);所以testStr中string类型的值不变。
changeStr方法中,传递了一份内存地址的值过去,只是改变了值,并没有通过原引用(内存地址)改变堆中的值。
所以打印结果不变。
@Test
public void testStr(){ //单元测试不能是静态的static
String str="123";
changeStr(str);
System.out.println(str);//123
}
static void changeStr(String str){
str="hello";//相当于 str = new String("hello"); new 一个string,再把新的引用赋值给name??
System.out.println(str.hashCode());
}
输出结果为:123