Java 方法参数怎么传

打开电脑写代码时,你是不是常碰到:写好一个功能函数,要传参数了,却纠结传“变量本身”还是“改后的新值”?比如要写个给水杯加水的代码,到底是直接倒进水杯,还是拿个新杯子装水再递过去?这其实就是Java方法参数传递的核心问题。

先搞懂:Java只有“值传递”这一种

很多人刚接触Java时,会被“值传递”“引用传递”绕晕,其实Java里根本不存在引用传递这回事!你可以把参数想象成“快递单号”:不管是寄普通包裹(基本类型),还是寄带编号的大件家具(引用类型),快递员(Java虚拟机)永远只认“单号”,不会把你家的房子直接搬去收件人那。

Java 方法参数怎么传

举个生活化例子:你给朋友发了个外卖订单(单号),朋友拿这个单号取餐,不管他把餐吃了还是转赠,你家楼下的外卖柜(原始数据)不会变;要是你朋友只把订单号抄了一遍给另一个人(复制值),另一个人取的还是同一个餐,不是你的家。

简单说:所有参数,不管是基本类型还是引用类型,传的都是“值”——基本类型传的是真实数值,引用类型传的是对象的内存地址值,仅此而已。

基本类型参数:改值也不影响原变量

基本类型就是int、boolean、double这些,存的是实实在在的数值,传参数时,是把这个数值的“副本”传给方法,方法里改的是副本,原变量的数值纹丝不动。

比如你写个“给数字加10”的方法:

`java

public static void addTen(int num) {

num = num + 10;

System.out.println("方法里的数值:" + num);

}

`

你在主方法里调用:

`java

int price = 20;

addTen(price);

System.out.println("主方法里的数值:" + price);

`

运行结果是:方法里的数值是30,主方法里的price还是20。就像你把20块钱复印了一份给朋友,朋友把复印件上的20改成30,你口袋里的真钱还是20,半毛没少。

引用类型参数:改对象属性会联动,改对象本身不影响

引用类型传的是对象的内存地址值,这个地址指向堆里的真实对象,所以方法里改对象的“内部属性”时,大家看的是同一个对象,会联动;但如果方法里让参数指向了新对象(相当于换了个地址),就和原变量没关系了。

还是用生活化例子:你给朋友发了小区单元门的地址(引用类型参数),朋友去这个地址找到你家的猫(对象),把猫喂饱(改属性),你家猫确实变饱了;但如果朋友直接在地址本上把单元号改成隔壁楼(让参数指向新对象),那隔壁楼的猫喂没喂,根本影响不到你家的猫。

写个代码验证:先定义一个猫咪类:

`java

class Cat {

String state;

Cat(String state) { this.state = state; }

}

`

再写两个方法:

`java

// 改猫咪状态的方法

public static void feedCat(Cat cat) {

cat.state = "吃饱";

System.out.println("方法里的猫状态:" + cat.state);

}

// 换一只猫的方法

public static void replaceCat(Cat cat) {

cat = new Cat("流浪猫");

System.out.println("方法里的新猫状态:" + cat.state);

}

`

主方法调用:

`java

Cat myCat = new Cat("饿");

feedCat(myCat);

System.out.println("主方法里的猫状态:" + myCat.state);

replaceCat(myCat);

System.out.println("换猫后主方法里的猫状态:" + myCat.state);

`

运行结果:feedCat后猫状态变成吃饱,主方法同步;replaceCat后方法里是流浪猫,主方法里还是吃饱。这就是引用类型参数的核心:改对象内部属性=联动,改参数指向的新对象=不影响。

划重点:别被“引用”两个字坑

很多人踩坑就是因为被“引用类型”的名字误导,以为传的是“对象本身”,其实Java一直是值传递。不管传啥,都是传一个副本:基本类型副本是数值,引用类型副本是地址。只要记住这个,不管是给函数传年龄、传对象,都不会搞混。下次写代码碰到参数改不动,先看看是不是在改副本,还是真的动了原对象就行。

上一篇 JavaScript 如何判断数组