您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
Java真的有引用传递吗?
方法,数据类型,类型Java真的有引用传递吗?
发布时间:2016-12-08加入收藏来源:互联网点击:
Java真的有引用传递吗?
回答于 2019-09-11 08:43:50
回答于 2019-09-11 08:43:50
Java只有值传递,没有引用传递。普通数据类型直接传递值,而对于引用类型来说传递值是所引用对象在堆区的内存地址。
回答于 2019-09-11 08:43:50
在Java中确实是只有值传递,没有引用传递的,在知道什么是值传递什么是引用传递的时候我也要知道什么是值类型,什么是引用类型;
值类型
在这里我就不用栈,堆,方法区这些东西来解释, 用最朴素的方式解释解释。
看看下面的图就知道什么是值类型了:
可以看到,值类型的声明出来在内存地址中是直接开辟空间存储值的,那么不同的变量会分配不同的内存空间。所以改变这个变量中的值对其它变量是没有影响的。
我们使用过的内容中,八大基本数据类型都是值类型,枚举也是值类型的。
引用类型
引用类型通过下面图片示例来看看:
声明一个对象,也就是引用类型在内存地址中存的不是值,而是指向实际对象的地址值。而它具体的对象是存在另外一个内存地址中。
所以如果你把当前对象赋值给另外一个对象,它们操作的就是同一个地址的对象,所以相互之间会有影响的。
我们了解到了两种数据的类型的工作原理,下面我们来看看什么是值传递什么是引用传递
值传递
值传递的传递方式就是直接把声明的内存地址中的值传递到方法中做运算,值传递对应的又可以用值数据类型做为参数,引用数据类型做参数
值类型做值传递
通过示例代码我们来理解
定义方法:
public void show(int a){//方法体}
调用方法:
int a=10;
对象名.show(a);
这个时候只会把实参a变量的值10传递到方法中做运算
引用类型做值传递也是通过示例代码来做理解
定义方法:
public void show(Student stu){//方法体}
调用方法:
Student stu=new Student();
对象名.show(stu);
引用类型会把对象的内存地址传到方法中做运算,因为我们上面讲了引用类型在内存中存的是地址值。所以引用类型做为参数传递到方法中做运算是会对实参stu有影响的。
引用传递
引用传递在是需要在定义方法的形参中和调用方法的实参中加一些特殊符号的,所以在Java中是没有所谓的引用传递的,那我就拿c#中的引用传递做示例来说说什么是引用传递。同样的引用传递是用不同的数据类型做为参数。引用传递实际就是把变量本身传递到方法中做运算。
值类型做引用传递
也是通过示例代码来理解,这里我用c#来做示例,值类型做引用传递
定义方法:
public void show(ref int a){}
调用方法:
int a=20;
对象名.show(ref a);
可以看到在c#中引用传递需要在形参和实参上都加上ref特殊符号,那么根据引用传递的概念这里实参变量a传递到方法中做运算会对实参有影响。
引用类型做引用传递其实引用类型做引用传递和值传递没有多大的区别,因为不管怎么你是做那种传递方式传进来的都是同一个地址值,也就是同一个对象。最后对实参都会有影响。
定义方法:
public void show(ref Student stu){//方法体}
调用方法:
Student stu=new Student();
对象名.show(ref stu);
总结:在Java中所谓的引用传递真的不存在,看到下面很多答主答的内容都是在说引用类型作为参数传递。总体来说数据类型总体两大类,值类型和引用类型。传递方式分为两种,值传递和引用传递。
如果有帮到您的,麻烦点个赞。如果有更好意见的小伙伴可以在评论区留言,绝对对第一时间回复,或者点个关注我们一起探讨探讨。
回答于 2019-09-11 08:43:50
是按值传递。Java 语言的参数传递只有按值传递。当一个实例对象作为参数被传递到方法中时,参数的值就是该对象的引用的一个副本。指向同一个对象,对象的内容可以在被调用的方法内改变,但对象的引用(不是引用的副本) 是永远不会改变的。
Java的参数传递,不管是基本数据类型还是引用类型的参数,都是按值传递,没有按引用传递!
回答于 2019-09-11 08:43:50
Java中只有值传递。
当我们将一个变量当成参数传递给某个方法的时候,无论该变量是基本数据类型,还是引用类型,传递的并非变量本身,而是变量的拷贝值,这也是为什么说Java只有值传递。
那么为什么会有引用传递这一说呢?
这是因为当传递的变量数据类型是引用类型的时候,变量存储的并不是真实的值,而是值的引用(可以理解为指针),我们拷贝一份出来当参数的时候,它存储的仍然是值的引用,当我们对引用的值进行修改的时候,他的影响是全局的,也就是原值会收到影响。但是基本类型不同,变量本身存储的值放在变量内存(栈)里面,不存在引用,所以修改拷贝变量的值,对原值没有影响。
所以说Java只有值传递,但是传递的类型不同,一些相同的操作影响会不同,所以有时我们会说引用传递。
希望我的回答对你有所帮助。
下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |