package com.victor.test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class Person {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Test {
public static void addInteger(Integer i){
i++;
}
public static void addInt(int i){
i++;
}
public static void addStr(String str){
str += "test";
}
public static String addStr2(String str){
return str+= "test";
}
public static void addList(List<String> alist){
alist.add("0");
}
public static List<String> addList2(List<String> alist){
alist.add("0");
return alist;
}
public static void addMap(Map<String,String> amap){
amap.put("1", "2");
}
public static Map<String,String> addMap2(Map<String,String> amap){
amap.put("1", "2");
return amap;
}
public static void modifyPerson(Person p){
p.setAge(11);
p.setName("victor");
}
public static void main(String[] args) {
int i = 0;
Test.addInt(i);
System.out.println("i = " + i);
Integer j = new Integer(1);
Test.addInteger(j);
System.out.println("j = " + j);
String str = "abc";
Test.addStr(str);
System.out.println(str);
List<String> alist = new ArrayList<String>();
System.out.println(alist.size());
Test.addList2(alist);
System.out.println(alist.size());
Map<String,String> amap = new HashMap<String,String>();
System.out.println(amap.size());
Test.addMap(amap);
System.out.println(amap.size());
Person p = new Person();
Test.modifyPerson(p);
System.out.println("name : " + p.getName() + " age : " + p.getAge());
}
}
为什么有得值被改变了,有的没有
------解决方案--------------------
前三个都不会改变
后三个都有可能改变
第一个是变量值,传递的就是一份int值,传进去的拷贝不影响外面
第二个传递引用,但Integer 是不可变对象,它的值一旦new出来,值就不可改变,所以传进方法对最初的Integer值不影响
第三个是传值,传进去的拷贝值不影响最初的原始值
后三个传递的是new出来的对象,都是传递的引用,且没有改变引用的指向,只是修改了对应的属性值,所以后三个都影响了。