什么是参数传递?他有什么用?
一 概述
1.什么是参数传递?
调用方法时向形参传递数据的过程叫做参数传递。在编程语言中有两种传递方式:值传递与引用传递。必须强调的是,这里提到的两种传递方式不是仅限于java使用到的传递方式,而是出现在包括java在内的多种编程语言中的传递方式。
2.变量类型
在java中,我们将指向基本类型数据的变量称为原始变量,将指向对象的变量称为引用变量。
二 值传递
1.什么是值传递?
将变量的副本传入方法,方法内外操作隔离,在方法内对变量的操作不会反映到方法外的变量中。
2.原始变量
public void change(int b) { b = 7; } @Testpublic void testBasic() {int a = 9; change(a); System.out.println(a); }
实际输出:9
在参数传递时,按照值传递的规则,变量b接收一个a的副本,同样指向字面值“9”:
接下来,在方法内部,为b赋值7,这样b指向7,由于a与b是两个相互独立的变量,两者之间没有引用与被引用的关系,a依然指向9:
3.String
public void change(String str01) { str01 = "baidu"; } @Testpublic void testString() { String str = new String("www.baidu.com"); change(str); System.out.println(str); }
实际输出:www.baidu.com
在参数传递时,str将自身的一个副本传递给str01,这样str01也指向堆中存放“www.baidu.com”的对象:
在方法内部为str01赋值,这样str01就指向方法区字符串常量池中的"baidu",str依然指向堆中的“www.baidu.com”,str与str01指向不同的对象,相互之间不影响:
这里需要注意一点:java将String设计成不可改变的对象,即一旦String对象包含的字面值发生改变,java就会新建一个对象,并将变量指向新的对象。
4.StringBuilder
public void change(StringBuilder builder01) { builder01.append(" World!"); } @Testpublic void testStringBuilder() { StringBuilder builder = new StringBuilder("Hello"); change(builder); System.out.println(builder); }
实际输出:Hello World!
在参数传递完成以后,builder01变量获得builder变量的一个副本,副本与原始变量指向堆中同一个对象:
在方法内部,变量builder没有指向新的对象,依然与builder指向同一对象,所以当builder访问堆中同一对象时,数据发生改变:
5.自定义类型
public class MyInner {public int a; }public class Test{public void change(MyInner in01) { in01.a = 1; } @Testpublic void testDemain() { MyInner in = new MyInner(); in.a = 9; change(in); System.out.println(in.a); } }
实际输出:1
执行过程同StringBuilder执行过程相同,这里不再赘述。下面对上面的代码做一点改动,如下:
public class MyInner {public int a; }public class Test{public void change(MyInner in01) { in01=new MyInner();//使in01指向一个新的对象in01.a = 1; } @Testpublic void testDemain() { MyInner in = new MyInner(); in.a = 9; change(in); System.out.println(in.a); } }
实际输出:9
参数传递完成时,in01与in指向同一个对象,in01对对象的操作等同于in对对象的操作,接着在方法内部执行"in01=new MyInner();",这样in01就指向了一个新的对象,in01所有的操作都与in无关了:
综合以上的运行结果与分析,可知java参数传递方式符合值传递。
三 引用传递
1.什么是引用传递?
将变量自身的内存地址传入方法中,方法中的变量指向方法外的变量,在方法中对变量的操作就是对方法外变量的操作。
2.自定义类型
public class MyInner {public int a; }public class Test{public void change(MyInner in01) { in01=new MyInner();//使in01指向一个新的对象in01.a = 1; } @Testpublic void testDemain() { MyInner in = new MyInner(); in.a = 9; change(in); System.out.println(in.a); } }
实际输出:9
如果采用引用传递,传递完成以后,in01指向in,对in01的操作就是对in的操作,in01指向对象2,那么in也指向对象2,输出1,与实际不符,所以不是采用引用传递。
不再一一分析其他变量类型,分析后可以发现,java在传递参数时采用的不是引用传递,而是值传递。
简单讲,值传递时方法内外是两个拥有同一指向的变量,引用传递时方法内外是同一个变量。
以上是什么是参数传递?他有什么用?的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

Java 8引入了Stream API,提供了一种强大且表达力丰富的处理数据集合的方式。然而,使用Stream时,一个常见问题是:如何从forEach操作中中断或返回? 传统循环允许提前中断或返回,但Stream的forEach方法并不直接支持这种方式。本文将解释原因,并探讨在Stream处理系统中实现提前终止的替代方法。 延伸阅读: Java Stream API改进 理解Stream forEach forEach方法是一个终端操作,它对Stream中的每个元素执行一个操作。它的设计意图是处

胶囊是一种三维几何图形,由一个圆柱体和两端各一个半球体组成。胶囊的体积可以通过将圆柱体的体积和两端半球体的体积相加来计算。本教程将讨论如何使用不同的方法在Java中计算给定胶囊的体积。 胶囊体积公式 胶囊体积的公式如下: 胶囊体积 = 圆柱体体积 两个半球体体积 其中, r: 半球体的半径。 h: 圆柱体的高度(不包括半球体)。 例子 1 输入 半径 = 5 单位 高度 = 10 单位 输出 体积 = 1570.8 立方单位 解释 使用公式计算体积: 体积 = π × r2 × h (4

Spring Boot简化了可靠,可扩展和生产就绪的Java应用的创建,从而彻底改变了Java开发。 它的“惯例惯例”方法(春季生态系统固有的惯例),最小化手动设置
