值传递
首先什么是值传递:
在java中 值的传递并不是字面上将一个变量的数值传递给另一个,而是将值的地址当成值来传递!
实例1
public class Student{
private String name;
private String name;
public Student(String name ,int age){
this.name = name;
this.age = age;
}
@Override
public string toString(){
return name + age
}
public static void change(Student s1, Student s2){
Student temp = new Student("王五",20);
temp = s1;
s1=s2;
s2 = temp;
}
public static void main(String[] args)
Student zhangsan = new Student ("张三",18);
Student lisi = new Student("李四",20);
Student.change(zhangsan,lisi);
System.out.println(zhangsan.toString());
System.out.println(lisi.toString());
}
当main方法进入方法区后,我们创立zhangsan,lisi两处空间他们储存如下图所示
即lisi对应空间存储 0x4地址中的内容 ,zhangsan存储0x1地址中的内容
1.创立完成后,执行change 我们将定义的chang入方法区,它进而创立了Student 类型的temp,并调用main方法中的参数创立 s1,s2.
2.将s1,指向zhangsan对应的0x1,s2指向lisi对应的0x4.我们假设temp 对应存储空间0x5区域 ,
3.change方法实现了 s1 s2的交换,s1和s2 的指向交换。随后change退出方法区。
4.继续执行main方法,输出zhangsan,lisi为 张三,18 /李四,20
上述示例告诉我们,即使在函数中我们交换了两个信息,但对于java来说他只是传递了地址信息,变量的存储并未发生变化。
实例2
public class Student{
private String name;
private String name;
public Student(String name ,int age){
this.name = name;
this.age = age;
}
@Override
public string toString(){
return name + age
}
public static void change(Student s1, Student s2){
Student temp = new Student("王五",20);
temp.name= s1.name;
s1.name=s2.name;
s2.name = temp.name;
}
public static void main(String[] args)
Student zhangsan = new Student ("张三",18);
Student lisi = new Student("李四",20);
Student.change(zhangsan,lisi);
System.out.println(zhangsan.toString());
System.out.println(lisi.toString());
}
1.首先执行main方法,创建zhangsan,lisi。存储同实例1.
2.唯一的改变就是,交换——change中变成了 s1.name, s2.name也就是说,将s1指向的0x1中的存储name的地址0x2同s2中的0x4 中的0x3交换,也就是说0x1中现在 0x3 18 0x4存储 0x2 20
如下图所示
3.继续指向main方法,输出zhangsan lisi,此时他们指向的0x1 和 0x4内容发生改变 输出:李四18,张三20