java中值传递和引用传递的区别,java值传递与引用类型传递
目录
1.基本数据类型2的参数传递。参考数据类型3的参数传递。原则
目的验证Java语言是值传递还是引用传递以及Java参数传递的实现原理。
问题介绍:
先读代码段3360。
public static void main(string[]args){ person p=新人(张三);f(p);system . out . println( argument : p);} public static void f(person p){ p . name=李四;System.out.println(参数: p);}运行结果3360
参数:Person{name="李四" }
实际参数:Person{name="李四" }
我们将一个对象变量传递到方法中,然后修改对象的属性并打印方法中的变量和参数。从表面上看,变量和参数的值都被修改了。Java也支持引用传递吗?
答案是:Java语言只支持值传递,不支持引用传递。
在验证Java参数传递之前,首先要了解函数值传递和引用传递的区别。
按值传递是指在调用函数时制作实际参数的副本,并将其传递给函数,这样,如果在函数中修改了参数,实际参数就不会受到影响。按引用传递是指调用函数时直接将实参的地址传递给函数,所以函数中参数的修改会影响实参。可见,值传递和引用传递的区别在于形式参数的修改是否会影响实际参数。
00-1010我们将一个基本的数据类型传入方法,然后在方法中修改参数的值,发现参数的修改并不影响实际的参数。
public static void main(String[]args){ int a=1;f(p);system . out . println( argument : a);}公共静态void f(int a){ a=2;System.out.println(参数: a);}
00-1010在问题引入的例子中,似乎是参数的修改影响了参数,但是只要我们新建一个对象,赋给参数,然后打印参数和参数,两者是不会互相影响的。说明Java不符合引用传递。
public static void main(string[]args){ person p=新人(张三);f(p);system . out . println( argument : p);}公共静态void f (person p) {p=新人(李四);System.out.println(参数: p);}
00-1010要了解为什么会出现这些现象,我们必须了解Java 3360背后的基本原理
JVM被分成许多块,我们创建的对象放在堆中,而基本数据类型和局部变量放在堆栈中。当传递基本数据类型时,会创建数据的副本并将其传递给方法,因此参数的修改不会影响参数,如图3360所示。
因为对象是放在堆里的,所以我们只能用对象的引用来操作这个对象。
当一个对象引用被传递给一个方法时,它实际上创建了一个引用副本,同时指向同一个对象。当通过形参引用和操作一个对象时,实际的实参似乎发生了变化。其实对象的内容变了,但是对象变量没变,实际的参数本身没变。所以不难理解问题中介绍的例子。
当我们重新分配参数时,参数不会受到影响。此时,实参和形参已经指向了两个不同的对象。
所以Java只支持值传递。
关于Java编程到底是值传递还是引用传递的深度探索的这篇文章到此为止。有关Java价值转移的更多信息,请搜索Popular IT以前的文章或继续浏览下面的相关文章。我希望你以后能更多地支持流行音乐!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。