Java是值传递(没有引用传递)!!!

柔情只为你懂 2022-09-04 00:53 88阅读 0赞

  很多程序设计语言(特别是,C++和Pascal)提供了两种参数传递的方式:值调用和引用调用。有些程序员认为Java程序设计语言对对象采用的是引用调用,实际上,这种理解是不对的。由于这种误解具有一定的普遍性,所以下面给出一个反例来详细地阐述一下这个问题。

  请问下面的employee1和employee2交换引用地址了吗?

  1. public static void main(String[] args) {
  2. Employee employee1 = new Employee("张三",1500);
  3. Employee employee2 = new Employee("李四",2000);
  4. System.out.printf("初始:employee1:%s,employee2:%s",employee1,employee2);
  5. swap(employee1, employee2);
  6. System.out.println();
  7. System.out.printf("swap后:employee1:%s,employee2:%s",employee1,employee2);
  8. }
  9. public static void swap(Employee e1, Employee e2) {
  10. Employee temp = e1;
  11. e1 = e2;
  12. e2 = temp;
  13. }

  完整代码如下:

  1. package com.demo.test.demo.api;
  2. /** * 探究Java究竟是值传递还是引用传递 * * @author zhao.hualuo * Create at 2021/8/9 */
  3. public class ParameterDemo {
  4. public static void main(String[] args) {
  5. Employee employee1 = new Employee("张三",1500);
  6. Employee employee2 = new Employee("李四",2000);
  7. System.out.printf("初始:employee1:%s,employee2:%s",employee1,employee2);
  8. swap(employee1, employee2);
  9. System.out.println();
  10. System.out.printf("swap后:employee1:%s,employee2:%s",employee1,employee2);
  11. }
  12. public static void swap(Employee e1, Employee e2) {
  13. Employee temp = e1;
  14. e1 = e2;
  15. e2 = temp;
  16. }
  17. /** * 雇员类 */
  18. static class Employee {
  19. /** 姓名 */
  20. private String name;
  21. /** 薪水 */
  22. private double salary;
  23. public Employee(String name, double salary) {
  24. this.name = name;
  25. this.salary = salary;
  26. }
  27. public String getName() {
  28. return name;
  29. }
  30. public void setName(String name) {
  31. this.name = name;
  32. }
  33. public double getSalary() {
  34. return salary;
  35. }
  36. public void setSalary(double salary) {
  37. this.salary = salary;
  38. }
  39. }
  40. }

  执行结果如下:

在这里插入图片描述
  由于java不是引用传递,所以上面的e1并不是employee1。
  e1只是employee1 copy出来的一个引用,这两个引用指向同一个地址,但是这俩并不是一个引用。所以可以说e1和e2互换了引用地址,但是不能说employee1和employee2交换了地址。

  下面是验证代码:

  1. package com.demo.test.demo.api;
  2. /** * 探究Java究竟是值传递还是引用传递 * * @author zhao.hualuo * Create at 2021/8/9 */
  3. public class ParameterDemo {
  4. public static void main(String[] args) {
  5. Employee employee1 = new Employee("张三",1500);
  6. Employee employee2 = new Employee("李四",2000);
  7. System.out.printf("外面:employee1:%s,employee2:%s",employee1,employee2);
  8. System.out.println();
  9. swap(employee1, employee2);
  10. System.out.println();
  11. System.out.printf("外面:employee1:%s,employee2:%s",employee1,employee2);
  12. }
  13. public static void swap(Employee e1, Employee e2) {
  14. System.out.printf("初始:e1:%s,e2:%s",e1,e2);
  15. Employee temp = e1;
  16. e1 = e2;
  17. e2 = temp;
  18. System.out.println();
  19. System.out.printf("最后:e1:%s,e2:%s",e1,e2);
  20. }
  21. /** * 雇员类 */
  22. static class Employee {
  23. /** 姓名 */
  24. private String name;
  25. /** 薪水 */
  26. private double salary;
  27. public Employee(String name, double salary) {
  28. this.name = name;
  29. this.salary = salary;
  30. }
  31. public String getName() {
  32. return name;
  33. }
  34. public void setName(String name) {
  35. this.name = name;
  36. }
  37. public double getSalary() {
  38. return salary;
  39. }
  40. public void setSalary(double salary) {
  41. this.salary = salary;
  42. }
  43. }
  44. }

  执行结果:
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,88人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java传递引用传递

    值传递和引用传递最大的区别是传递的过程中有没有复制出一个副本来,如果是传递副本,那就是值传递,否则就是引用传递。 Java对象的传递,是通过复制的方式把引用关系传递了,因为有

    相关 java传递引用传递

    在Java中一切皆对象,无论是int a;还是String a;,这两个变量a都是对象。 在传递的时候究竟是按什么方式传递的呢?其答案就是:即是按值传递也是按引用传递,但通