基本类型与引用类型,传递形参时都是传递实际参数的一个copy(或者称之为拷贝),基本类型传递实际值的copy,引用类型传递引用的copy,引用类型中如果修改形参的属性则会影响实际参数
笔记:
public static void test(String str){
}
//此处str就是形参
public static void main(String[] args) {
int i = 0;
updInt(i);
System.out.println(i);
String str = "kylin";
updString(str);
System.out.println(str);
Map<String,Object> map = new HashMap<>();
map.put("name","kylin");
updMap(map);
System.out.println(map.toString());
Test t = new Test();
t.setAge(18);
t.setName("张三");
updTest(t);
System.out.println(t.toString());
}
static class Test{
int age;
String name;
//忽略get,set,toString方法
}
public static void updTest(Test t){
t = new Test();
t.setAge(50);
t.setName("李四");
}
public static void updMap(Map<String,Object> map){
map.put("name","method ky");
}
public static void updString(String str){
str = "ky";
}
public static void updInt(int i){
i = 30;
}
0
kylin
{name=method ky}
Test{age=18, name='张三'}
method1,method2:结果没有变
method3由于修改了形参map中的属性,此处虽然是copy引用,但实际引用与copy引用都是指向同一个对象的,所以修改会影响实际参数,结果变化
method4在调用的函数中将Test()重新new了,将引用指向了一个新的地址,此时修改属性是修改新对象的属性,原来对象则不受影响,结果没有变
总结:java中的形参是复制实参的一份拷贝(对于引用型则是复制引用的拷贝)(在栈中的拷贝),所以在函数中改变形参是无法改变实参的值的,改变引用只是将形参所代表的引用指向另外的新的对象,而实参的引用还指向原来的对象,改变形参引用的成员当然会影响实参引用成员的值,因为他们的引用都指向同一个对象。