网站首页 > java教程 正文
如果你学的第一门程序语言是java可能对这个传递方式没有那么敏感,如果学了c或c++,然后再学java,那么可能对这个问题会感到困惑。
1.值传递与引用传递的概念
在将传递方式之前先理解一下形参与实参。
形式参数:是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数。
实际参数:在调用有参函数时,主调函数和被调函数之间有数据传递关系。在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”。
可以这么理解:形参是实参的抽象,实参是调用时的参数,形参是定义函数的参数
值传递:方法调用时,实际参数把它的值传递给对应的形式参数,函数接收的是原始值的一个copy,此时内存中存在两个相等的基本类型,即实际参数和形式参数,后面方法中的操作都是对形参这个值的修改,不影响实际参数的值。
引用传递:是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
划重点:值传递和引用传递的主要区别
值传递
引用传递
创建副本,在函数体中不能改变原来的值
不创建副本,在在函数体中不能改变原来的值
创建副本的含义
创建副本也就是说,把要调用的实参先拷贝一份出来,然后用拷贝的那一份传进函数体内。不创建副本时,不会发生copy这个步骤。
举个值传递的栗子:
1 public class Test01 { 2 public static void main(String[] args) { 3 int a=1,b=2; 4 swap(a, b); 5 System.out.println("a="+a); 6 System.out.println("b="+b); 7 } 8 public static void swap(int a,int b) { 9 int temp=a; 10 a=b; 11 b=temp; 12 } 13 }
结果:
1 a=1 2 b=2
上面栗子中,在函数中让实现a,b交换,但调用函数后,输出的结果仍然是a,b原来的值,说明函数体中的操作并不能影响a,b在函数体外的值。
引用传递的栗子就不测试了,有兴趣的话可以用c++来测试,参数为定义为别名或指针时,在c++中是引用传递。
误区:传递的参数如果是普通类型,那就是值传递,如果是对象,那就是引用传递。这是错误的!!!!!
2.java中的值传递
在java中,无论参数是基本类型,还是引用数据类型,都是值传递方式。下面来举个引用数据类型的参数,基本数据类型的栗子上面已经有了。
1 public class Test01 { 2 public static void swap(Student st1,Student st2) { 3 Student temp=st1; 4 st1=st2; 5 st2=temp; 6 } 7 8 public static void main(String[] args) { 9 Student st1=new Student("张三",20); 10 Student st2=new Student("李四",20); 11 swap(st1, st2); 12 System.out.println("st1:"+st1); 13 System.out.println("st2:"+st2); 14 }
结果:
1 st1:Student [name=张三, age=20] 2 st2:Student [name=李四, age=20]
例子中,st1和st2的所指向的对象并没有发生改变。
这时候,你可能会问,既然java是值传递,那么实参会发生拷贝,那拷贝的是什么东西呢?答案是:拷贝的是对象在堆中的地址。来个栗子来验证一下:
1 public class Test01 { 2 public static void print(Student stu1,Student stu2) { 3 Student temp=stu1; 4 stu1=stu2; 5 stu2=temp; 6 System.out.println("在函数体中交换后打印stu1: "+stu1); 7 System.out.println("在函数体中交换后打印stu2: "+stu2); 8 } 9 10 public static void main(String[] args) { 11 Student stu1=new Student("stu1",20); 12 Student stu2=new Student("stu2",30); 13 print(stu1, stu2); 14 } 15 }
结果:
1 在函数体中交换后打印stu1: Student [name=stu2, age=30] 2 在函数体中交换后打印stu2: Student [name=stu1, age=20]
从结果中可以看出,在函数体中stu1和stu2所指向的对象确实是发生了改变,这是因为在值传递的过程中拷贝了他们在堆中的地址。
来看看他们在内存中的怎么样的:
这时候你可能会问,既然java的值传递是拷贝地址,那我能不能改变地址所只想的内容?答案是:当然可以
1 public static void changeInf(Student stu) { 2 stu.setName("我改名字了"); 3 } 4 5 public static void main(String[] args) { 6 Student stu=new Student("张三",18); 7 changeInf(stu); 8 System.out.println(stu); 9 }
结果:
1 Student [name=我改名字了, age=18]
结论:java中只有值传递,这可能是因为java没有指针和别名引用的原因吧。
猜你喜欢
- 2024-10-20 Java类的基本定义(java 类的)
- 2024-10-20 作为测试人员,这些概念你不懂的话,你好意思说你懂Java?
- 2024-10-20 java基础学习笔记(四) - 深度解析八大基础类型
- 2024-10-20 尚学堂java学习笔记:Java各版本的含义
- 2024-10-20 java基础知识——什么是媒体?(解释什么叫媒体)
- 2024-10-20 三分钟学习Java泛型中T、E、K、V、?的含义
- 2024-10-20 吃人的那些 Java 名词:对象、引用、堆、栈
- 2024-10-20 什么是Java架构?(什么是JAVA架构师)
- 2024-10-20 Java中关于引用的介绍(java中的引用是什么意思)
- 2024-10-20 「Java」详解常见的53个关键字(java详解)
你 发表评论:
欢迎- 07-21如何将 iPhone 中的联系人导出到 Excel/CSV?
- 07-21sql查询的字段数据中有逗号。放到csv文件会分开,如何解决?
- 07-21在 WebAPI 里生成 csv zip 文件(webapi怎么发布在iis上)
- 07-21如何把csv格式转换成Excel格式(csv格式怎么转换)
- 07-21如何将高程导出为XYZ或CSV高程点(如何将高程数据导入cad)
- 07-21使用python把csv汇总成excel(python怎么将csv文件中的列存入列表)
- 07-21解决PHP导出CSV文件中文乱码问题(php导出excel文件)
- 07-21使用vba将Excel 文件转成 CSV 文件
- 最近发表
-
- 如何将 iPhone 中的联系人导出到 Excel/CSV?
- sql查询的字段数据中有逗号。放到csv文件会分开,如何解决?
- 在 WebAPI 里生成 csv zip 文件(webapi怎么发布在iis上)
- 如何把csv格式转换成Excel格式(csv格式怎么转换)
- 如何将高程导出为XYZ或CSV高程点(如何将高程数据导入cad)
- 使用python把csv汇总成excel(python怎么将csv文件中的列存入列表)
- 解决PHP导出CSV文件中文乱码问题(php导出excel文件)
- 使用vba将Excel 文件转成 CSV 文件
- python爬虫25 | 爬取的数据怎么保存?CSV了解一下
- MySQL 导出数据(mysql 导出数据 判断成功)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)