Java基础面试题 ——参数传递是按值还是按引用?

哈根达斯
2024-12-10 / 0 评论 / 3 阅读 / 正在检测是否收录...

回答重点

在 Java 中,参数传递只有按值传递,不论是基本类型还是引用类型。

  • 基本数据类型 (如 int, char, boolean 等):传递的是值的副本,即基本类型的数值本身。因此,对方法参数的任何修改都不会影响原始变量。
  • 引用数据类型(如对象引用):传递的是引用的副本,即对象引用的内存地址。因此,方法内可以通过引用修改对象的属性,但不能改变引用本身,使其指向另一个对象。

扩展知识

基本类型与引用类型的区别

  • 基本类型 :包括 int, float, double, char, boolean 等,存储在栈内存中。方法中对基本类型参数的操作只会影响传递的副本,原始变量的值不受影响。
  • 引用类型 :包括所有的对象和数组,引用类型的变量存储的是对象在堆内存中的地址。当引用类型作为参数传递时,传递的是这个地址的副本。因此,方法内的修改可以影响到传入的对象的内容,但不会影响对象引用本身的地址。

示例代码分析


public class ParameterPassing {
    public static void main(String[] args) {
        int a = 5;
        modifyPrimitive(a);
        System.out.println("After modifyPrimitive: " + a); // 输出: 5

        MyObject obj = new MyObject();
        obj.value = 10;
        modifyObject(obj);
        System.out.println("After modifyObject: " + obj.value); // 输出: 20

        resetReference(obj);
        System.out.println("After resetReference: " + obj.value); // 输出: 20
    }

    public static void modifyPrimitive(int num) {
        num = 10; // 仅仅修改了副本,不影响原始变量
    }

    public static void modifyObject(MyObject obj) {
        obj.value = 20; // 修改了对象的属性,会影响原始对象
    }

    public static void resetReference(MyObject obj) {
        obj = new MyObject(); // 修改的是引用的副本,不影响原始对象
        obj.value = 30;
    }
}

class MyObject {
    int value;
}
  • modifyPrimitive 方法中,num 是基本类型的副本,因此对它的修改不影响原始变量 a
  • modifyObject 方法中,obj 是引用类型的副本,但这个副本仍指向原始对象,因此修改 value 属性会影响原始对象。
  • resetReference 方法中,obj 被重新赋值为一个新对象,这个变化只影响副本,不影响原始引用。

另外,近期才哥整理出了一个可用于快速刷面试题的小程序,其中收录了常见面试题及其答案,涵盖了基础、并发、JVM、MySQL、Redis、Spring、SpringMVC、SpringBoot、SpringCloud、消息队列等多个类型,感兴趣的微信扫码体验

才哥IT刷题小程序

0

评论 (0)

取消