先请看代码:
public class NewTest {
public static void changeS(List<String> list) {
list.add("ooc");
}
public static void changeS(int i) {
i = i + 1;
}
public static void change(String str, char ch[]) {
str = new String("ttttt");
ch[0] = 'C';
}
public static void changeName(Person p) {
p.setName("黑狐");
}
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("1");
changeS(list);
list.add("2");
System.out.println(list); // 1-----》结果 [1, ooc, 2]
int i = 0;
i = i + 1;
changeS(i);
i = i + 1;
System.out.println(i); // 2-----》结果 2
String str = "World";
char ch[] = { 'H', 'e', 'l', 'l', 'o' };
change(str, ch);
System.out.println(str + " and " + String.valueOf(ch)); // 3-----》结果World and Cello
Person p = new Person();
p.setName("雪豹");
changeName(p);
System.out.println(p.getName()); // 4-----》结果 黑狐
}
}
class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
近来个人觉得对java传参是只是值传递这个说法比较疑惑,遂列出了上述四种情况研究。
根据查阅资料得知 :
方法参数有2种
1 基本参数(比如int,char等)
2 对象引用(比如数组,String等)
基本参数:没办法进行对传递值进行改变。
对象参数:由于传递后,对对象进行了拷贝,于是都指向了同一个对象。可以对传递值进行改变。
Java中利用方法参数可以做到和不能做到的几种情况:
1 方法不能修改基本类型的参数 (例2)
2 方法可以修改对象参数的状态 (例1 4 和 3中的数组变化)
因此,即可以修改数组中的一个项或几个项。
3 方法不能让对象参数指向新的对象* (例3 中的字符串无变化)
无法对对象进行=,这样是达不到欲达到的对参数中的对象进行重赋值的目的的。
简单来说 就是:
1、对于原始数据类型,也就是int、 long、char之类的类型,是传值的,如果你在方法中修改了值,方法调用结束后,那个变量的值没用改变。
2、对于对象类型,也就是Object的子类,如果你在方法中修改了它的成员的值(属性),那个修改是生效的,方法调用结束后,它的成员是新的值,但是如果你把它指向一个其它的对象,方法调用结束后,原来对它的引用并没用指向新的对象。