微信公众号:Java随笔录
关注可了解更多Java相关的技术分享。问题或建议,欢迎公众号留言!
前言
今天聊一个很小的话题,值传递和引用传递。这个话题在其他高级语言中比较常见,但是在Java中,你一定听到过或者在网上看到过:“Java没有引用传递,只有值传递”。到底是怎么回事呢?今天就来聊一聊Java中的参数传递。
代码示例
这里通过一段简单的代码来一探究竟:
public class Test {
private String str = new String("Java随笔录");
private char[] chars = new char[] {'谢', '谢', '你'};
private int num = 666;
private void func(String _str, char[] _chars, int _num) {
_str = "欢迎关注公众号: Java随笔录";
_chars[0] = '感';
_num = 888;
}
public static void main(String[] args) {
Test test = new Test();
test.func(test.str, test.chars, test.num);
System.out.println("str = " + test.str);
System.out.println("chars = {" + test.chars[0] + ", " + test.chars[1] + ", " + test.chars[2] + "}");
System.out.println("num = " + test.num);
}
}
输出结果:
str = Java随笔录
chars = {感, 谢, 你}
num = 666
值传递?引用传递?
首先,小录很明确的告诉大家,在Java中只有值传递,没有引用传递!先明确这个点,再听我细细道来。
概念
值传递
方法调用时,实参的数值被复制到另一个变量,然后传递复制的对象。
引用传递
方法调用时,实际参数的地址直接传递到方法中。
对比
- | 值传递 | 引用传递 |
---|---|---|
区别 | 创建副本 | 不创建副本 |
实参是否改变 | 函数中无法改变实际参数 | 函数中可以改变原始实际参数 |
要点
所以说,值传递和引用传递的真正区别是:传递时,实际参数是否创建了副本。 不要去管参数是基本类型还是引用类型。
详解示例代码
为什么char数组中改变了?
因为实参和形参指向的是同一个数组对象,方法中改变的不是参数本身,而是改变了它所指向的对象。
错误的区分基本类型和引用类型
从上述示例代码可以看到,无论是String还是int,即使在方法中都进行改变,但实参都没有改变,所以和参数什么类型没有关系。
公众号
- 关注公众号,即时接收关于Java的技术分享!