面试官问我 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 是值传递还是引用传递的全部内容了,快去和面试官对线吧~
-
创作不易,感谢阅读,若遇到问题,可以关注此微信公众号留言反馈,希望能够帮助到您。
原文始发于微信公众号(EzCoding):面试官问我 Java 是值传递还是引用传递
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/203622.html