首页 > 编程语言 >Java是值传递还是引用传递?

Java是值传递还是引用传递?

时间:2024-10-11 14:18:28浏览次数:9  
标签:Java 传入 数据类型 传递 修改 地址 引用

相信很多人听到值传递和引用传递,多多少少都会有一个疑问,为什么Java是值传递,引用数据类型也是值传递?

为什么会混淆引用数据类型和引用传递?

说白了,为什么很多人包括作者,之前都觉得java的基本数据类型是值传递,没问题,因为传入参数是一个值相同的副本,那为什么传入一个对象也是值传递呢,我们又没有创建一个新的一样的对象,这个跟引用传递和传入对象地址有区别的。

java中的传入变量无非是基本数据类型或者引用数据类型,但是处理不一样,基本数据类型只在函数内部,而引用数据类型是地址,可以通过这个地址指向堆空间中的具体对象,直接进行修改。

而我们区分开引用传递和地址修改,地址修改是指引用类型数据被传入,也就是一个地址被传入,再通过这个修改的地址指向对应的对象,进行对象的修改。

而引用传递是指直接传入一个地址,里面不存在对象和地址指向对象的引用关系,而且也不存在对象的修改。只是传入一个地址。

所以值传递就是,传值+对这个值副本+加对副本修改。

引用传递就是,传变量本身。

我们可以举个例子,当你在main函数中写下一个变量a指向一个对象,那么你传入的时候写的形参是这个a吗,不是,它只是a的副本,跟a有着相同的地址,我们可以通过这个地址去访问对象,但是传入的毕竟不是a本身。

而所谓引用传递,传的就是变量a本身,至于它指不指向别的变量或者地址或者内容或者对象,我们不关心,这种传递方式就是一种引用传递。

Java是值传递还是引用传递

值传递:函数调用时,调用者与被调用者获取的变量不是同一个变量,而是值相同的副本。

C语言是值传递。

Java继承自C语言,所以也都是值传递。

Java中的基本数据类型都是值传递,引用数据类型也是值传递,比如int都是值传递,String也是值传递。

所谓引用传递:函数调用时,调用者与被调用者指向同一个变量,对函数中的数据修改会影响原数据的值。

说回值传递,当使用"="赋值时,因为创建了相同值的副本,所以想要在函数中,对原函数数据的修改必须1.通过void变为int 让它具有返回值,并且2.用"="去接收返回值,重新赋给原数据才行。

如果不这样做会怎么样,会返回a的原值也就是18,因为从头到尾被函数操作的那个变量也就是传入参数的形参,是一个备份,仅仅是值相等。

而引用数据类型的值传递则不会,直接通过传入的副本地址对堆空间中对象进行修改,也就是只修改栈变量在堆中的地址名,改变这个变量名的指向,指向对应的对象,并不会覆盖原数据。

总结

所谓值传递和引用传递,是函数传递时备份值相等的数据,还是直接修改变量本身。

站在使用者的角度,Java中的所有传递都是值传递,都是需要备份的,值传递发生在基本数据类型,我们需要传回对应的返回数据,才能确保达到修改的效果,原因是函数内部的修改不会对外部造成影响,除非有变量指向外部的空间。最终呈现的效果就是返回值,加赋值操作(接住返回值)。

在创建引用数据类型的对象时,直接传入引用变量,系统通过变量内的地址找到实际的对象进行修改,这样不需要传回返回值。最终呈现效果就是传入的对象可以直接进行修改,所以不需要返回值,也不需要赋值,返回值可以用来干别的事情。

标签:Java,传入,数据类型,传递,修改,地址,引用
From: https://blog.csdn.net/m0_60715044/article/details/142851646

相关文章

  • 线性回归算法(Java)
      手动实现线性回归(梯度下降法)1publicclassLinearRegressionGD{2privatedoublelearningRate;3privateintiterations;4privatedoubleslope;5privatedoubleintercept;67publicLinearRegressionGD(doublelearningRate,......
  • [1380]基于JAVA的建筑物施工智慧管理系统的设计与实现
    毕业设计(论文)开题报告表姓名学院专业班级题目基于JAVA的建筑物施工智慧管理系统的设计与实现指导老师(一)选题的背景和意义在当前全球信息化、智能化的大背景下,建筑施工行业的管理模式也正经历着深刻变革。随着国家对智慧城市和智慧工地的大力推广与政策支持,基于信息技术......
  • 为什么 Java 中的时间类如此繁多而复杂?
    为什么Java中的时间类如此繁多而复杂?从事程序员这些年,在业务中处理最繁琐且容易出现的场景就是时间处理,而且Java当中的时间类繁琐又复杂,类型从字符串转Date,LocalDate等等,时间计算、时间差、区间计算等场景太多且不可避免。怎么回事呢?在Java的世界中,时间类显得尤为繁多......
  • 【hot100-java】LRU 缓存
    链表篇灵神题解  classLRUCache{privatestaticclassNode{intkey,value;Nodeprev,next;Node(intk,intv){key=k;value=v;}}privatefinalintcapacity;//哨兵节点......
  • 【hot100-java】二叉树的右视图
    二叉树篇tql /***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*TreeNode(){}*TreeNode(intval){this.val=val;}*TreeNode(intval,TreeNodeleft,Tre......
  • 【hot100-java】合并 K 个升序链表
    链表篇/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*ListNode(intval){this.val=val;}*ListNode(intval,ListNodenext){this.val=val;this.next=next;......
  • [Java/Spring] 深入理解 : Spring ApplicationContext
    [Java/Spring]深入理解:SpringApplicationContext1概述:ApplicationContext简介2源码分析ApplicationContextpackageorg.springframework.context;publicinterfaceApplicationContextextendsEnvironmentCapable,ListableBeanFactory,HierarchicalBeanFactor......
  • 一款Java CMS 网站管理系统,基于RuoYi-fast二次开发,网站后台采用SpringBoot + MyBati
    一款JavaCMS网站管理系统基于RuoYi-fast二次开发,网站后台采用SpringBoot+MyBatis文章目录前言一、开源地址二、环境要求三、功能亮点3.1扩展功能3.2内置功能四、安装方法4.1、拉取源码4.2、修改数据库链接配置4.3、创建数据库并导入数据4.4、配置资源上传......
  • 【Java】异常处理指南
     ......
  • 【Java 】包装类详解:从基本概念到实战技巧
     ......