值传递,引用传递,String传递的数值变化。
值传递:
public class TestJava{
}
class Person{
int age = 30;
}
class Demo{
public static void transfer(int tempT){
tempT = 50;
}
public static void main(String[] args){
Person per = new Person();
System.out.println(per.age);
transfer(per.age);
System.out.println(per.age);
}//main
}//Demo
per.age是数值,所以传递到函数transfer中的只是per.age的副本,
无论副本在方法transfer中如何变化,per.age本身并不发生变化。
输出:
30
30引用传递:
public class TestJava{
}
class Person{
int age = 30;
}
class Demo{
public static void transfer(Person perTemp){
perTemp.age = 50;
}
public static void main(String[] args){
Person per = new Person();
System.out.println(per.age);
transfer(per);
System.out.println(per.age);
}//main
}//Demo
此为引用对象传递,transfer方法接收了Person类的对象per,并将其age属性赋值50。
因为是引用传递,方法中对对象的改变操作会保存下来。
输出:
30
50
String传递:
public class TestJava{
}
class Person{
String name = "FangXy";
}
class Demo{
public static void transfer(String nameTemp){
nameTemp = "Hello";
}
public static void main(String[] args){
Person per = new Person();
System.out.println(per.name);
transfer(per.name);
System.out.println(per.name);
}//main
}//Demo
虽然String是引用类型,不过别忘了字符串一旦生成不可改变。
传递的参数为per.name,为String类型变量。
per.name 指向 “FangXy”。
当per.name传递进transfer时,nameTemp与per.name同时指向“FangXy”
每一个字符串都是一个匿名String类型变量,在内存中开辟空间写入“Hello”
将nameTemp指向“Hello”的存储地址。同时断开nameTemp和“FangXy”直接的连接。
方法结束后,nameTemp与“Hello”同时等待销毁,per.age依然指向“FangXy”。
分析结束。
输出:
FangXy
FangXy
但如果方法接收的是类的对象,且字符串是类中属性。
public class TestJava{
}
class Person{
String name = "FangXy";
}
class Demo{
public static void transfer(Person perTemp){
perTemp.name = "Hello";
}
public static void main(String[] args){
Person per = new Person();
System.out.println(per.name);
transfer(per);
System.out.println(per.name);
}//main
}//Demo
对象传入方法transfer后,perTemp和per同时指向一块内存区域(同一个对象)。
per.name和perTemp.name均为“FangXy”(per和perTemp指向同一对象)。
在transfer方法中,perTemp.name被修改为“Hello”。
此时,per与perTemp指向的同一对象的name属性变为了Hello。“FangXy”字符串进入垃圾回收机制。
退出方法transfer之后,修改保留。此时per指向的对象,其name属性为“Hello”。
输出:
FangXy
Hello