所有栏目 | 云社区 美国云服务器[国内云主机商]
你的位置:首页 > 云社区 » 正文

Java真的有引用传递吗?

发布时间:2020-04-12 08:41:54

资讯分类:java  引用  传递  数据类型  引用  方法
Java真的有引用传递吗?

严格来说,Java只有值传递,没有引用传递一说。那么为什么会有这种说法?

首先来说说Java的数据类型。Java的数据类型分为基本数据类型和引用数据类型。

基本数据类型大致分为:byte、short、int、long四种整数型,float和double两种浮点型(也就是小说), 一种char字符型加一种boolean类型。而引用数据类型则是除这八种数据类型之外的所有数据类型。

那么基本数据类型和引用数据类型区别在哪呢?其区别在于对应数据类型的对象在内存中的位置不同。

jvm内存分为:方法栈区、堆内存区、本地方法栈、方法区以及程序计数器等。其中,我们常提到的两块内存是堆内存区和方法栈区。

接下来我还得说说啥叫变量。在Java中变量就是一个合法字符,用来存储某个对象对应的地址值。变量的值都是存储在方法栈区,不论是基本数据类型还是引用数据类型。只不过数据类型不同,该变量所指向的真正对象的值所存储区域不同。

对于基本数据类型来说,其值是直接放在方法栈区中,可以认为变量值就是其对象所对应的值。因此,当你进行方法调用时,是将方法栈中的值直接进行了传递。

但是对于引用数据类型来说则不是。引用数据类型存在两种值:真正值和引用值,其中引用值就是变量值。因为Java不允许直接访问堆区内容,所以我们只能通过方法栈区的变量值来间接访问堆中的真正值。因此,当进行方法调用时,实参会将其对应的引用值进行传递。究其本质,引用数据类型还是值传递,只不过传递的是引用值罢了。所以这就导致某些人说是引用传递。

当然,有时候说引用传递也没错,只不过我觉得不够严谨罢了。

Java真的有引用传递吗?

Java中只有值传递。

当我们将一个变量当成参数传递给某个方法的时候,无论该变量是基本数据类型,还是引用类型,传递的并非变量本身,而是变量的拷贝值,这也是为什么说Java只有值传递。

那么为什么会有引用传递这一说呢?

这是因为当传递的变量数据类型是引用类型的时候,变量存储的并不是真实的值,而是值的引用(可以理解为指针),我们拷贝一份出来当参数的时候,它存储的仍然是值的引用,当我们对引用的值进行修改的时候,他的影响是全局的,也就是原值会收到影响。但是基本类型不同,变量本身存储的值放在变量内存(栈)里面,不存在引用,所以修改拷贝变量的值,对原值没有影响。

所以说Java只有值传递,但是传递的类型不同,一些相同的操作影响会不同,所以有时我们会说引用传递。

希望我的回答对你有所帮助。

Java真的有引用传递吗?

在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中所谓的引用传递真的不存在,看到下面很多答主答的内容都是在说引用类型作为参数传递。总体来说数据类型总体两大类,值类型和引用类型。传递方式分为两种,值传递和引用传递


如果有帮到您的,麻烦点个赞。如果有更好意见的小伙伴可以在评论区留言,绝对对第一时间回复,或者点个关注我们一起探讨探讨。

Java真的有引用传递吗?

Java只有值传递,没有引用传递。普通数据类型直接传递值,而对于引用类型来说传递值是所引用对象在堆区的内存地址。

留言与评论(共有 0 条评论)
   
验证码:
Top