You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中无返回值的void方法为何能对main方法的数组完成排序?

为什么无返回值的sort方法能修改main里的数组?

嘿,这问题问到点子上了——刚接触Java的小伙伴几乎都会在这儿卡一下,我来给你把这个逻辑讲明白:

首先先帮你补全并格式化代码(原代码漏了Scanner的导入,不然编译会报错哦):

import java.util.Scanner;

public class SortDemo {
    public static void sort(int [] ar,int n){
        for(int i=0;i<n;i++){
            for(int j=0;j<n-1;j++){
                int temp;
                if (ar[j]>ar[j+1]){
                    temp= ar[j];
                    ar[j]= ar[j+1];
                    ar[j+1]= temp;
                }
            }
        }
    }
    public static void main (String [] args){
        Scanner scan = new Scanner(System.in);
        System.out.println("Enter input here: ");
        int n= scan.nextInt();
        int arr[]= new int[n+2];
        System.out.println("Enter input here: ");
        for (int i=0; i<n;i++){
            arr[i]= scan.nextInt();
        }
        for (int i=0; i<n;i++){
            System.out.printf("%d\t",arr[i]);
        }
        sort(arr,n);
        System.out.println("\n");
        for (int i=0; i<n;i++){
            System.out.printf("%d\t",arr[i]);
        }
    }
}

核心原因:Java中数组是引用类型,参数传递的是内存引用地址

这里的关键要区分「基本类型」和「引用类型」的参数传递逻辑:

  • 如果你传递的是int、double这类基本类型,Java会把变量的值复制一份传给方法参数,方法里修改参数只会改动副本,原变量完全不受影响。
  • 但数组属于引用类型:当你把main里的arr传给sort方法的ar参数时,传递的不是整个数组的副本,而是arr保存的「数组对象在内存中的地址」。也就是说,ar和arr其实指向的是同一个数组对象。

所以你在sort方法里做的元素交换操作,都是直接在这个共享的数组对象上进行的——哪怕sort是void无返回值,原数组已经被实实在在地修改了,main方法里再打印arr,自然就是排序后的结果啦。

打个简单的比方:你有一把柜子钥匙(arr),复制了一把给朋友(ar),你们俩用的钥匙都能打开同一个柜子(数组对象)。朋友打开柜子把里面的东西重新整理了(排序),你再打开柜子,看到的就是整理好的东西,完全不需要朋友把柜子还给你~

内容的提问来源于stack exchange,提问作者Sharif Zhumon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 14:57:28