面试官问我 Java 是值传递还是引用传递
0 概述
- Java 的参数传递机制是一个常见的面试题,讨论的焦点通常是 Java 是值传递还是引用传递。在本文中,我将针对这个问题进行分析,方便后续和面试官进行 battle。
- 先上结论:Java 的参数传递机制是基于值传递(Pass-by-Value)。简单来说,当我们将一个变量作为参数传递给一个方法时,实际上是将这个变量的值传递给了方法内部的形参,而不是将变量本身传递进去。这意味着方法内部对形参的修改不会影响到原始的变量。
1 注意事项
-
尽管 Java 的参数传递机制是基于值传递,但对于引用类型的参数,需要特别注意它们的行为。在 Java 中,引用类型的变量存储的是对象的引用(内存地址),而不是对象本身。当我们将一个引用类型的变量作为参数传递给一个方法时,实际上是将这个引用的副本传递给了方法内部的形参。因此,方法内部对形参所引用的对象进行的操作,会影响到原始的对象。
-
然而,需要注意的是,如果在方法内部对引用进行了重新赋值操作,即改变了引用所指向的对象,那么这个改变不会影响到原始的引用。这是因为方法内部的引用只是原始引用的一个副本,它们指向的是不同的内存地址。
2 代码示例
-
为了更好地理解 Java 的参数传递机制,下面通过一个简单的代码示例来演示:
/** * @作者 Jasper * @公众号:EzCoding */ public class PassByValueDemo { public static void main(String[] args) { int num = 10; Person person = new Person("Jasper"); modifyValue(num); System.out.println("基本数据类型,被修改后的值是: " + num); modifyReference(person); System.out.println("引用数据类型,被修改后的值是: " + person.getName()); // 影响原始的引用 modifyAtMethodInner(person); System.out.println("在方法内对引用进行重新赋值后的结果:" + person.getName()); // 不会影响原始的引用 } public static void modifyValue(int value) { value = 20; } public static void modifyReference(Person person) { person.setName("EzCoding"); } public static void modifyAtMethodInner(Person person) { person = new Person("xxx"); } } class Person { private String name; public Person(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } /** * 输出: * 基本数据类型,被修改后的值是: 10 * 引用数据类型,被修改后的值是: EzCoding * 在方法内对引用进行重新赋值后的结果:EzCoding */
-
从输出结果可以看出:
- 尽管在
modifyValue()
方法中修改了 value 的值,但是在 main 方法中的 num 变量的值并没有受到影响 - 而在
modifyReference()
方法中修改了 person 所引用的 Person 对象的名字,这个改变影响到了 main 方法中的 person 对象(因为引用还是原来的对象,把对象原来的值修改了) - 但是在
modifyAtMethodInner()
方法中,对 person 对象进行了重新赋值操作, 相当于改变了对象的引用(即内存地址被改变了),因此即使是设置值为 xxx,也不会影响到原对象的值
- 尽管在
-
以上就是 Java 是值传递的全部内容了,快去和面试官对线吧~
-
创作不易,感谢阅读,若遇到问题,可以关注此微信gzh:EzCoding 留言反馈,希望能够帮助到您