面试题:简述什么是值传递和引用传递?

在 Java 中,参数传递的方式分为 值传递(Pass by Value) 和 引用传递(Pass by Reference)。Java 中只有 值传递,但可以通过值传递的方式传递对象的引用。

  1. 值传递(Pass by Value)
    • 值传递是指将实际参数的  复制一份传递给方法的形式参数。
    • 对于基本数据类型(如 intcharboolean 等),传递的是实际值的副本。
    • 在方法内部对形式参数的修改不会影响实际参数的值。
    • 示例:
      public class ValuePassExample {
          public static void modifyValue(int value) {
              value = 100; // 修改的是副本,不影响原始值
          }
      
          public static void main(String[] args) {
              int originalValue = 50;
              modifyValue(originalValue);
              System.out.println("原始值: " + originalValue); // 输出: 原始值: 50
          }
      }
  2. 引用传递(Pass by Reference)
    • Java 中没有真正的引用传递,但可以通过值传递的方式传递对象的引用。
    • 对于对象类型(如数组、类实例等),传递的是对象引用的副本(即内存地址的副本)。
    • 在方法内部对对象属性的修改会影响原始对象,因为形式参数和实际参数指向同一个对象。
    • 示例:
      public class ReferencePassExample {
          public static void modifyObject(MyObject obj) {
              obj.value = 100; // 修改的是原始对象的属性
          }
      
          public static void main(String[] args) {
              MyObject originalObject = new MyObject(50);
              modifyObject(originalObject);
              System.out.println("对象值: " + originalObject.value); // 输出: 对象值: 100
          }
      }
      
      class MyObject {
          int value;
          MyObject(int value) {
              this.value = value;
          }
      }

总结:

  • 值传递:传递的是实际值的副本,适用于基本数据类型。
  • 引用传递:Java 中没有真正的引用传递,但可以通过值传递的方式传递对象的引用(即内存地址的副本),适用于对象类型。
  • 关键区别:
    • 值传递不会影响原始值。
    • 引用传递(通过值传递的方式)会影响原始对象的属性,但不会改变引用本身(即不能改变对象指向)。

示例对比:

public class PassExample {
    public static void modifyValue(int value) {
        value = 100; // 不影响原始值
    }

    public static void modifyObject(MyObject obj) {
        obj.value = 100; // 影响原始对象的属性
    }

    public static void main(String[] args) {
        int originalValue = 50;
        modifyValue(originalValue);
        System.out.println("原始值: " + originalValue); // 输出: 原始值: 50

        MyObject originalObject = new MyObject(50);
        modifyObject(originalObject);
        System.out.println("对象值: " + originalObject.value); // 输出: 对象值: 100
    }
}

class MyObject {
    int value;
    MyObject(int value) {
        this.value = value;
    }
}
THE END
点赞7 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容