面试题:Java 中的参数传递是按值还是按引用?

在 Java 中,参数传递机制可以概括为“按值传递”(Pass by Value)。这意味着当一个方法被调用时,实际参数的值会被复制给形式参数。然而,理解这一点的关键在于区分基本数据类型和对象引用如何进行传递。

基本数据类型的参数传递

对于基本数据类型(如 int, float, char, boolean 等),传递的是值的副本。因此,在方法内部对这些参数的任何修改都不会影响到方法外部的实际参数值。

public void increment(int x) {
    x++;
}

int number = 5;
increment(number);
// number 的值仍然是 5

在这个例子中,number 的值不会因为 increment 方法中的操作而改变,因为在方法内操作的是 number 的一个副本。

对象引用的参数传递

对于对象(包括数组、类实例等),传递的是对象引用的副本。也就是说,方法接收的是指向同一个对象的另一个引用。如果在方法内部通过这个引用来修改对象的状态(即对象的内容),那么这些修改会影响到方法外部的实际对象。但是,如果试图将方法内的引用指向一个新的对象,则这种改变不会反映到方法外部。

public void changeObjectName(MyObject obj) {
    obj.setName("New Name");
    // 这会修改原始对象的 name 属性

    obj = new MyObject(); // 创建新的对象
    obj.setName("Another Name");
    // 这不会影响到方法外的对象,因为我们只是改变了局部变量 obj 的引用
}

MyObject myObj = new MyObject();
myObj.setName("Original Name");
changeObjectName(myObj);
// myObj.getName() 仍然返回 "New Name" 而不是 "Another Name"

在这个例子中,setName("New Name") 修改了 myObj 对象本身的数据,所以外部也能看到这个变化。但重新赋值给 obj 并不会影响外部的 myObj,因为这仅仅是改变了方法内部引用的指向。

总结

  • 基本数据类型:按值传递,方法内对参数的修改不影响外部变量。
  • 对象引用:虽然也是按值传递(传递的是引用的一个副本),但由于引用指向同一个对象,所以在方法内部修改对象状态会影响外部对象。但如果在方法内部改变了引用指向的对象,则这种改变对外部无影响。

理解这一机制有助于避免由于参数传递方式引起的误解和潜在错误。

THE END
喜欢就支持一下吧
点赞14 分享