一筐愿望 2021-05-07 21:37 采纳率: 60%
浏览 28
已结题

Java:数组为什么不是引用传递的?

LeetCode 第 189 题要求将数组 nums 中元素均向右移动 k 位

public class Solution {
	public static void main(String[] args) {
		int[] nums = { 1, 2, 3, 4, 5, 6, 7 };
		new Solution().rotate(nums, 3);
	}
	public void rotate(int[] nums, int k) {
		int[] ret = new int[nums.length];
		for (int i = 0; i <= nums.length - 1; i++) {
			ret[(i + k) % nums.length] = nums[i];
		}
		System.arraycopy(ret, 0, nums, 0, nums.length); // 正确
        // nums = array; // 错误
	}

}

我的疑问是为什么最后的步骤需要通过 System.arraycopy 复制数组元素,而不能直接写成 nums = array 呢?我直接将 nums 这个引用指向 array 的内存地址不可以吗?求解

------------------------------------------- 分割线 -------------------------------------------

看完《深入理解Java虚拟机》回来复盘这个问题,其实不用理解与区分值传递引用传递的概念与二者在Java与C++的区别,理解Java虚拟机的运行时数据区即可,罗列几点对我自己理解这个问题的知识点:

  • 数组普通对象没有区别,只是数组中会存储附加字段记录当前数组长度而已,所以数组普通对象都是存储在中的
  • 不同方法会对应不同的栈帧栈帧中有私有的局部变量表用于存储当前方法涉及到的变量,main 方法中的 nums 已预先添加至 main 方法的栈帧局部变量表,main 方法调用 rotate 方法时,形参会添加至 rotate 方法的栈帧局部变量表,也就是说目前全局会有两个 nums 引用,分别存储在 main 方法的局部变量表与 rotate 方法的局部变量表**,互相独立,因此将 rotate 方法中的 nums 指向 ret 时,main 方法中的 nums 并不受影响
  • Java虚拟机中的数据类型除了我们常见的boolean、byte、char、short,还有一种叫做reference,也就是我们通常理解的引用

 

  • 写回答

2条回答 默认 最新

  • cckpspys 2021-05-08 09:27
    关注

    Java只有值传递,main()方法中的 int[] nums = { 1, 2, 3, 4, 5, 6, 7 };   可以看成有一个指针nums 指向了数组,当你将 nums 传参进rotate()方法时,复制了另一个指针(这个指针刚好也叫nums)指向了数组,当你直接将rotate()方法的 nums指向 ret 时,跟main()方法的nums指针没有任何关系,还是指向了原来的数组。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月2日
  • 已采纳回答 7月25日
  • 修改了问题 7月25日
  • 修改了问题 7月25日
  • 展开全部

悬赏问题

  • ¥35 平滑拟合曲线该如何生成
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集