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
相关产品推荐
相关产品推荐

