Java方法的参数传递机制实例详解
作者:下班后的爪哇菌 发布时间:2021-05-24 07:38:29
本文实例讲述了Java方法的参数传递机制。分享给大家供大家参考,具体如下:
参数传递机制
对于程序设计语言来说,一般方法(函数)的参数传递有两种:按值传递和按引用传递。
按值传递意味着当将一个参数传递给一个方法时,方法接收的是原始值的一个副本。因此,如果方法修改了该参数,仅改变副本,而原始值保持不变。按引用传递意味着当将一个参数传递给一个方法时,方法接收的是原始值的内存地址,而不是值的副本。因此,如果方法修改了该参数,调用代码中的原始值也随之改变。
需要注意的是,方法可以修改按引用传递的参数对应的变量值,但不可以修改按值传递的参数对应的变量值,这是两者的最大区别。
Java中的参数传递
Java中的参数传递机制只有一种,就是值传递。在Java中并没有C++的引用传递这种参数传递机制,它所有的参数传递都遵循值传递的机制。
Java中对于对象(数组,类,接口)的传递似乎有点像引用传递,可以改变对象中某个属性的值。但是不要被这个假象所蒙蔽,实际上这个传入方法的值是对象引用的拷贝,即传递的是引用的地址值,所以还是按值传递。
基本类型的参数传递
在方法调用时,传递的参数是按值的拷贝传递;
public class Test {
public static void main(String[] args) {
Test t = new Test();
int a = 5;
t.method(a); // 传递后,method方法对变量值的改变不影响这里的a
System.out.println("method调用完后的a: " + a);
}
private void method(int a){
System.out.println("method中重新赋值之前的a: " + a);
a = 10;
System.out.println("method中重新赋值之后的a: " + a);
}
}
执行结果如下:
method中重新赋值之前的a: 5
method中重新赋值之后的a: 10
method调用完后的a: 5
由此可知按值传递重要特点:传递的是值的拷贝,也就是说传递后就互不相关了。下面看一下内存分析:
引用类型的参数传递
在方法调用时,传递的参数按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。
public class Test {
public static void main(String[] args) {
Person person = new Person();
person.age = 18;
// 把main方法中的变量person所引用的内存空间地址,按引用传递给method方法中的person变量
// 请注意:这两个person变量是完全不同的,不要被名称相同所蒙蔽
method(person);
System.out.println("调用method方法之后:" + person.age);
}
public static void method(Person person){
person.age = 20;
System.out.println("method方法内第一次修改:" + person.age);
person = new Person(); // 新创建一个对象
person.age = 25;
System.out.println("method方法内第二次修改:" + person.age);
}
}
class Person {
public int age;
}
执行结果如下:
method方法内第一次修改:20
method方法内第二次修改:25
调用method方法之后:20
这里传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。
下面我们接着看一个例子:
public class Test {
public static void main(String[] args) {
int[] a = {5, 10};
method(a);
System.out.println("调用完method方法之后:" + a[0]);
}
public static void method(int[] a){
System.out.println("method内修改a[0]之前:" + a[0]);
a[0] = 50;
System.out.println("method内修改a[0]之后:" + a[0]);
}
}
执行结果如下:
method内修改a[0]之前:5
method内修改a[0]之后:50
调用完method方法之后:50
根据结果可知,调用method方法时实际传递的是引用的地址值。
传递String类型的参数
由于String类是final修饰的,不可变,它会在内存中在开辟一块新空间。
public class Test {
public static void main(String[] args) {
String str1 = new String("test1");
String str2 = "test2";
method(str1, str2);
System.out.println("调用method传参str1之后:" + str1 + ", " + str2);
}
public static void method(String str1, String str2){
System.out.println("method内修改str之前:" + str1 + ", " + str2);
str1 = "new1";
str2 = "new2";
System.out.println("method内修改str之后:" + str1 + ", " + str2);
}
}
执行结果如下:
method内修改str之前:test1, test2
method内修改str之后:new1, new2
调用method传参str1之后:test1, test2
总结:
1)基本数据类型传递的是值的复制,对一个参数的修改不会影响另一个参数;
2)引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象;
3)String、Integer、Double等immutable的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象(与基本数据类型一致)。
更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
来源:https://blog.csdn.net/lxxiang1/article/details/82317183


猜你喜欢
- C#貌似没有专门用于ASCII码转字符或字符转ASCII码的系统函数,所以小编这里就借用一下强制类型转换来实现ASCII码与字符之间的互转。
- 步骤一:1.查看Eclipse版本的eclipse--help--About Eclipse,在Eclipseplatfrom那行的Vers
- 前言这几天专门研究了下JNI编程,在网上找了好多资料,不过好多都是以前的,没有更新,而且有的还是错误的,让人不得不吐槽一把。所以觉得自己来一
- 本文实例讲述了Android编程实现小说阅读器滑动效果的方法。分享给大家供大家参考,具体如下:看过小说都知道小说阅读器翻页有好多种效果,比如
- 1.string是引用类型还是值类型MSDN官方说string是引用类型;引用类型:引用分配栈内存,引用类型本身的数据存储在堆中;值类型:在
- 单纯使用GridView通用的两种给GridView 添加分割线的方法;http://stackoverflow.com/questions
- 问:怎样才能将XML文件导入SQL Server 2000? 答:将XML文件导入SQL Server有若干种方法,这里提供其中的3种: 大
- Visual Studio 2022 默认.net framework4.8,而4.6~4.7版本的.net framework可以通过方法
- 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档前言这两天在项目中使用到Java的导入导出功能,以前对这块有一定了解,但是没
- 1. 下载Tomcat首先,下载Apache Tomcat并解压到本地计算机,可存放于任何位置。另外,需要在系统中环境JRE_H
- 1,刚刚在别人开源的项目中看到了一个挺不错的用户体验,效果图如下:2,那下面我们就来实现一下,首先看一下布局,由于一般只是我们包含头像的那部
- 问题(1)重入锁是什么?(2)ReentrantLock如何实现重入锁?(3)ReentrantLock为什么默认是非公平模式?(4)Ree
- 上一篇文章我们了解了Java背包问题求解实例代码,接下来我们看看Java中模仿用户登录的相关代码,下面是具体内容。基于用户从控制台输入模拟的
- 开发项目的时候,表很多,是不可能一点点的自己去写xml ,dao文件的,这里就需要用到代码的自动生成工具了。第一步:导入jar包,当然,这之
- 几乎所有运算符都只能操作“主类型”(Primitives)。例外是“=”、“= =”和“! =”,它们能操作所有对象。除此以外,String
- 去公司面试,对方一口一个controller,一口一个service,dao,搞得我很紧张。其实都是很简单的东西,只是自己当时不知道罢了,接
- 上篇文章说了通过RestTemplate实现微服务之间访问:https://www.jb51.net/article/252981.htm,
- 本文实例为大家分享了unity使用socket实现聊天室的具体代码,供大家参考,具体内容如下unity聊天室服务端实现using Syste
- 使用Palette API选择颜色 良好的视觉设计是app成功所必不可少的, 而色彩设计体系是设计的基础构成. Palette包是
- 微信聊天现在非常火,是因其界面漂亮吗,哈哈,也许吧。微信每条消息都带有一个气泡,非常迷人,看起来感觉实现起来非常难,其实并不难。下面小编给大