Java是值传递(没有引用传递)!!!
很多程序设计语言(特别是,C++和Pascal)提供了两种参数传递的方式:值调用和引用调用。有些程序员认为Java程序设计语言对对象采用的是引用调用,实际上,这种理解是不对的。由于这种误解具有一定的普遍性,所以下面给出一个反例来详细地阐述一下这个问题。
请问下面的employee1和employee2交换引用地址了吗?
public static void main(String[] args) {
Employee employee1 = new Employee("张三",1500);
Employee employee2 = new Employee("李四",2000);
System.out.printf("初始:employee1:%s,employee2:%s",employee1,employee2);
swap(employee1, employee2);
System.out.println();
System.out.printf("swap后:employee1:%s,employee2:%s",employee1,employee2);
}
public static void swap(Employee e1, Employee e2) {
Employee temp = e1;
e1 = e2;
e2 = temp;
}
完整代码如下:
package com.demo.test.demo.api;
/** * 探究Java究竟是值传递还是引用传递 * * @author zhao.hualuo * Create at 2021/8/9 */
public class ParameterDemo {
public static void main(String[] args) {
Employee employee1 = new Employee("张三",1500);
Employee employee2 = new Employee("李四",2000);
System.out.printf("初始:employee1:%s,employee2:%s",employee1,employee2);
swap(employee1, employee2);
System.out.println();
System.out.printf("swap后:employee1:%s,employee2:%s",employee1,employee2);
}
public static void swap(Employee e1, Employee e2) {
Employee temp = e1;
e1 = e2;
e2 = temp;
}
/** * 雇员类 */
static class Employee {
/** 姓名 */
private String name;
/** 薪水 */
private double salary;
public Employee(String name, double salary) {
this.name = name;
this.salary = salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
}
执行结果如下:
由于java不是引用传递,所以上面的e1并不是employee1。
e1只是employee1 copy出来的一个引用,这两个引用指向同一个地址,但是这俩并不是一个引用。所以可以说e1和e2互换了引用地址,但是不能说employee1和employee2交换了地址。
下面是验证代码:
package com.demo.test.demo.api;
/** * 探究Java究竟是值传递还是引用传递 * * @author zhao.hualuo * Create at 2021/8/9 */
public class ParameterDemo {
public static void main(String[] args) {
Employee employee1 = new Employee("张三",1500);
Employee employee2 = new Employee("李四",2000);
System.out.printf("外面:employee1:%s,employee2:%s",employee1,employee2);
System.out.println();
swap(employee1, employee2);
System.out.println();
System.out.printf("外面:employee1:%s,employee2:%s",employee1,employee2);
}
public static void swap(Employee e1, Employee e2) {
System.out.printf("初始:e1:%s,e2:%s",e1,e2);
Employee temp = e1;
e1 = e2;
e2 = temp;
System.out.println();
System.out.printf("最后:e1:%s,e2:%s",e1,e2);
}
/** * 雇员类 */
static class Employee {
/** 姓名 */
private String name;
/** 薪水 */
private double salary;
public Employee(String name, double salary) {
this.name = name;
this.salary = salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
}
执行结果:
还没有评论,来说两句吧...