1.传递基本数据类型
传递值
所以调用完change(a)函数后
change(char newA)方法里的a 作用域 仅限于 该方法内
main中的a的值不变
public static void main(String[] args) {
char a='a';
change(a);
System.out.println("a = " + a);
}
public static void change(char newA) {
newA='b';
}
2.传递对象
1.不操作引用地址
参数类型是Person , 所以传递的是一个引用地址
change(Person p2)方法中, 接收到了一个引用参数,这个引用地址指向对象在堆里的地址。
所以p2.age++ 是对原对象操作,所以对main函数中的值有影响
举个例子, 小明的身份证号是 12X,
传递的参数可以认为是 12X , 因为12X就表示小明
现在对身份证号是 12X的人进行 信息录入处理, 在家里(main)大家都觉得小明(12X)的年龄是2
家里人把小明(12X),带到了派出所(change), 派出所(change)给小明(12X)的年龄加了一岁(p2.age++)
所以回到家后小明(12X)的最终年龄是3
public class Reference {
public static void main(String[] args) {
Person p1 = new Person();
p1.age=2;
change(p1);
System.out.println("p1.age = " + p1.age);
}
public static void change(Person p2) {
p2.age++;
}
}
class Person {
int age=0;
}
/**
* output p1.age = 3
*/
2.操作引用地址
传递了引用地址(不准确,只是作为标识) com.ybj.cbt.Person@22d8cfe0
进入change()方法后
对原引用进行了新的实例化, 即在堆内分配了新地址,并将新的地址赋值给原引用,
p2=new Person()之后
p2就不指向原地址了, p2指向 com.ybj.cbt.Person@579bb367
所以p2.age++ 就不会对原对象产生影响
例如
再举个例子, 又是小明, 小明还有个双胞胎哥哥大明,大明的身份证号是13X
小明的身份证号是 12X,
现在对身份证号是 12X的人进行 信息录入处理, 在家里(main)大家都觉得小明(12X)的年龄是2
家里人把小明(12X),带到了派出所(change), 不过这次是是给双胞胎哥哥大明办身份证, 反正长得都一样
到了派出所,
小明变成了大明( p2=new Person())
派出所(change)给大明(13X)的年龄加了一岁(p2.age++)
所以回到家后,小明(12X)的年龄没有变,因为是大明(13X)的年龄自增了
public class Reference {
public static void main(String[] args) {
Person p1 = new Person();
System.out.println("p1 = " + p1);
p1.age=2;
change(p1);
System.out.println("p1.age = " + p1.age);
}
public static void change(Person p2) {
p2=new Person();
System.out.println("p2 = " + p2);
p2.age++;
}
}
class Person {
int age=0;
}
/**
* p1 = com.ybj.cbt.Person@22d8cfe0
* p2 = com.ybj.cbt.Person@579bb367
* p1.age = 2
*/
这里有些描述问题,日后改善

被折叠的 条评论
为什么被折叠?



