class Student {
int age;
String name;
public Student(int age,String name)
{
this.age=age;
this.name=name;
}
}
public class Demo {
// 基本数据类型参数传递
public static void changeJiBen(int x) {
x = 520;
}
//引用数据类型参数传递
public static void changeYinYong(Student s) {
s.age=101;
}
public static void main(String[] args) {
int x = 250;
Student s=new Student(23,"Keyee");
changeJiBen(x);
changeYinYong(s);
System.out.println("x=" + x);
System.out.println("s.age=" + s.age);
}
/*
* 我们可以看到输出x=250,s.age=101。其实只要搞清楚了传递参数的
* 规则,就不难理解。在主函数中调用changeJiBen时,并没有把存放
* 在main方法栈区的x的地址传递给changeJiBen的形参,而是传递了
* 250这个整数值,也就是一旦调用了该方法,形参整数的值就变为250。
* 而这个形参存放在changeJiBen的方法栈区内,如果在改变其值,与
* main方法里的x不会有任何关系。那为什么传递Student这个引用对象
* 却能修改呢。这就很有趣了。在main方法里建立了Student对象后,引
* 用对象s存放在main栈区里,s并没有存放实际的数据,它是一个指针。
* 它指向了堆内存里的实际的Student对象,这个对象存放了age=23,
* name="Keyee"。在调用changeYinYong时,形参得到的是实际对象
* 在堆内存的地址,也就是形参和main里的s指向了同一块堆内存,两个
* 方法操作同一份数据,当然可以看到其改变。
* 本来应该上图的,时间有点仓促。不知这样讲,是否够详细。如果不详
* 细,我再整理一下。把图也画出来,写成日志。顺便也解释一下你传递
* String的疑惑。
*
*/
} |