Java之方法参数
将参数传递给方法的两种方式:
1.按值调用(call by value),方法接收的是调用者提供的值;
2.按引用调用(call by reference),方法接收的是调用者提供的变量地址。
最早还有按名调用(call by name),已成历史。
一、基本数据类型的参数
代码如下:
1 public class ClassTest { 2 3 int num = 9; 4 5 static void increase(int x) { 6 x = x * 9; 7 } 8 9 public static void main(String[] args) { 10 ClassTest ct = new ClassTest(); 11 increase(ct.num); 12 System.out.println("num = " + ct.num); 13 } 14 }
输出结果:
num = 9
结果分析:
1. x 初始化为 ct.num 的一个副本,x 值为 9;
2. x 乘以 9 后等于 81 ,但 ct.num 值仍为 9;
3.方法结束后,参数变量 x 不再使用。
二、引用类型的参数
代码如下:
public class ClassTest { int num = 9; static void increase2(ClassTest c) { c.num = c.num * 9; } public static void main(String[] args) { ClassTest ct = new ClassTest(); increase2(ct); System.out.println("num = " + ct.num); } }
输出结果:
num = 81
结果分析:
1. c 初始化为 ct 的一个副本,这里就是一个对象引用;
2. c 和 ct 同时引用的 ClassTest 对象的 num 值被扩大了九倍;
3.方法结束后,参数变量 c 不再使用,对象变量 ct 继续引用 num 值扩大九倍后的对象。
三、对象引用
“Java程序设计语言对对象采用的是按引用调用”,实际上,这种理解是不对的,但这种误解也具有一定的普遍性。
反例如下:
1 public class ClassTest { 2 3 int num = 9; 4 5 static void increase2( ClassTest c) { 6 c.num = c.num * 9; 7 } 8 9 static void swap(ClassTest x, ClassTest y) { 10 ClassTest temp = x; 11 x = y; 12 y = temp; 13 } 14 15 public static void main(String[] args) { 16 ClassTest ct1 = new ClassTest(); 17 ClassTest ct2 = new ClassTest(); 18 19 increase2(ct2); // ct2.num = 81 20 swap(ct1, ct2); // 若按引用调用,则交换后 ct1.num = 81,ct2.num = 9 21 System.out.println("ct1.num = " + ct1.num); 22 System.out.println("ct2.num = " + ct2.num); 23 } 24 }
输出结果:
ct1.num = 9
ct2.num = 81
结果分析:
这个方法并没有改变储存在变量 ct1 和 ct2 中的对象引用,swap 方法参数 x 和 y 被初始化为两个对象的副本,这个方法交换的是这两个的副本。
方法结束时,参数 x 和 y 被丢弃,原来的变量 ct1 和 ct2 仍引用方法调用之前所引用的对象。
结果说明,Java程序设计语言对对象采用的不是按引用调用,对象引用是按值传递的。
四、总结
“在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。
在Java里面只有基本数据类型和String是按值传递,其它的都是按引用传递。
在Java中对方法参数能做什么和不能做什么:
1.方法不能改变基本类型的参数(即数值型或布尔型);
2.方法可以改变对象参数的状态;
3.方法不能让一个对象参数引用一个新的对象。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?