Java是值传递还是引用传递,值传递和引用传递的区别 java
这篇文章已经给大家带来了一些关于java的知识,主要是关于java是值传递还是引用传递。下面就来看看吧,希望对你有帮助。
如何解决写爬虫IP受阻的问题?立即使用。
目的:验证Java语言是值传递还是引用传递以及Java参数传递的实现原理。
问题介绍:
首先阅读代码片段:
公共静态void main(String[] args){
人p=新人(张三);
f(p);
System.out.println(参数: p );}public static void f(Person p){
P.name=李四;
system . out . println( parameter: p );}我们将一个对象变量传递到方法中,然后在方法中修改对象的属性,并打印变量和参数。从表面上看,变量和参数的值都被修改了。Java也支持引用传递吗?
在
答案是:Java语言只支持值传递,不支持引用传递. |
按值传递是指在调用函数时制作实际参数的副本,并将其传递给函数,这样,如果在函数中修改了参数,实际参数就不会受到影响。按引用传递是指调用函数时直接将实参的地址传递给函数,所以函数中参数的修改会影响实参。可见,值传递和引用传递的区别在于形式参数的修改是否会影响实际参数。
1.基本数据类型的参数传递
我们将一个基本的数据类型传入方法,然后在方法中修改参数的值,发现参数的修改并不影响实际的参数。
公共静态void main(String[] args){
int a=1;
f(p);
System.out.println(参数: a );}public static void f(int a){
a=2;
system . out . println( parameter: a );}
2.引用数据类型的参数传递
在问题引入的例子中,似乎是参数的修改影响了参数,但是只要我们创建一个新的对象,赋给参数,然后打印参数和参数,两者是不会相互影响的。说明Java不符合引用传递。
公共静态void main(String[] args){
人p=新人(张三);
f(p);
System.out.println(参数: p );}public static void f(Person p){
p=新人(‘李四’);
system . out . println( parameter: p );}
3.原理
要理解为什么会出现这些现象,我们必须了解Java背后的基本原理:
JVM被分成许多块,我们创建的对象放在堆中,而基本数据类型和局部变量放在堆栈中。传递基本数据类型时,会创建数据的副本并将其传递给方法,因此参数的修改不会影响实参,如图所示:
因为对象是放在堆里的,所以我们只能用对象的引用来操作这个对象。
当一个对象引用被传递给一个方法时,它实际上创建了一个引用副本,同时指向同一个对象。当通过形参引用和操作一个对象时,实际的实参似乎发生了变化。其实对象的内容变了,但是对象变量没变,实际的参数本身没变。所以不难理解问题中介绍的例子。
当我们重新分配参数时,参数不会受到影响。此时,实参和形参已经指向了两个不同的对象。
所以Java只支持值传递。
推荐:《java视频教程》以上是一起分析java是值传递还是引用传递的详细内容。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。