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一直是值传递。不管传啥,都是传一个副本:基本类型副本是数值,引用类型副本是地址。只要记住这个,不管是给函数传年龄、传对象,都不会搞混。下次写代码碰到参数改不动,先看看是不是在改副本,还是真的动了原对象就行。