当前位置: 首页 > news >正文

java只有按值传递 没有引用传递

结论

(1):“在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。

(2):在Java里面只有基本类型和按照下面这种定义方式的String是按值传递,其它的都是按引用传递。就是直接使用双引号定义字符串方式:String str = “Java私塾”;

为什么没有引用传递

那就要先弄清楚什么是引用传递? 

值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

Java里传递的是引用的副本,虽然这个副本也是引用。但是在Java中只能说是传递对象的引用,而不能叫引用传递。

ava传递的是引用的副本。而不是引用本身,所以引用没有传递,所以这个不叫引用传递。

例子

c++

class User{
    public TV getTV(&TV tv){//C++可以这样来传递引用 而不是对象引用的副本  &TV 代表传入一个引用
         //这里传递一个TV 的引用 这个引用跟Java的引用是有区别的
         tv = new TV("xiaomi");//我修改为了小米牌的
         //如果在Java里 这句话不会影响传入的tv 但是 C++ 会影响
    } 
    
}  

java

class User{
    public TV getTV(TV tv){
         tv = new TV("xiaomi");//我修改为了小米牌的
         //如果在Java里 这句话不会影响传入的tv 但是 C++ 会影响
    } 
    
}  

上面代码如果是在c++中,那么实参tv被修改成了指向xiaomi的地址

而在java中,实参tv不会被改变,因为形参里的tv只是副本,它本身地址的改变不会影响实参。

所以,值传递和引用传递的区别并不是传递的内容。而是实参到底有没有被复制一份给形参。在判断实参内容有没有受影响的时候,要看传的的是什么,如果你传递的是个地址,那么就看这个地址的变化会不会有影响,而不是看地址指向的对象的变化。

易错点

上面说形参tv本身地址的改变不会影响实参,其实tv可以改变实参tv的内容。

比如

class User{
    public TV getTV(TV tv){
         tv.setName("xiaomi");
    } 
    
}  

 这样就改变了实参tv引用的对象。

下面举一个实际的例子:

你有一把钥匙,当你的朋友想要去你家的时候,如果你直接把你的钥匙给他了,这就是引用传递。这种情况下,如果他对这把钥匙做了什么事情,比如他在钥匙上刻下了自己名字,那么这把钥匙还给你的时候,你自己的钥匙上也会多出他刻的名字。

你有一把钥匙,当你的朋友想要去你家的时候,你复刻了一把新钥匙给他,自己的还在自己手里,这就是值传递。这种情况下,他对这把钥匙做什么都不会影响你手里的这把钥匙。

但是,不管上面哪种情况,你的朋友拿着你给他的钥匙,进到你的家里,把你家的电视砸了。那你说你会不会受到影响?而我们在pass方法中,改变user对象的name属性的值的时候,不就是在“砸电视”么。你改变的不是那把钥匙,而是钥匙打开的房子。

所以说你改变的不是实参tv地址,而是改变的tv指向的对象。而在c++中是可以直接改变tv地址的。

所以说,Java中其实还是值传递的,只不过对于对象参数,值的内容是对象的引用。


转载:

Java中的参数传递_好久不见-CSDN博客_java传参

为什么说Java中只有值传递_程序员小灰的博客-CSDN博客_java值传递

Java只有值传递 - 简书

相关文章:

  • Typecho Fancybox 给文章图片添加灯箱效果
  • an error occured while loading the archive
  • 电脑无限循环cmd代码 Window系统下死循环
  • python 实现批量 csv文件 转化为 execl...
  • js 搜索子字符串 判断是否是子串 的方法
  • 禁用css 的浏览器插件 Web Developer
  • Baconian (Stegano, Encoding, C..的解法
  • mac直接修改压缩包
  • servlet获取ApplicationContext容器对象
  • org.apache.tomcat.util.modeler.BaseModelMBean.invoke 调用方法[createStandardContext]时发生异常
  • java.lang.ClassNotFoundException: org.springframework.context.support.ClassP
  • maven web-app没有新建servlet
  • org.springframework.beans.factory.BeanCreationException 一个解决方法
  • 注解支持的元素类型
  • LSB (Stegano, Image, Training) Write up
  • hexo+github搭建个人博客
  • 【React系列】如何构建React应用程序
  • CentOS7简单部署NFS
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • React 快速上手 - 07 前端路由 react-router
  • Sass 快速入门教程
  • swift基础之_对象 实例方法 对象方法。
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 删除表内多余的重复数据
  • 什么软件可以剪辑音乐?
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 手机端车牌号码键盘的vue组件
  • 为什么要用IPython/Jupyter?
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 学习JavaScript数据结构与算法 — 树
  • 异常机制详解
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • # Panda3d 碰撞检测系统介绍
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (力扣)循环队列的实现与详解(C语言)
  • (算法)Game
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .gitignore文件—git忽略文件
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .skip() 和 .only() 的使用
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • @Data注解的作用
  • @EnableWebMvc介绍和使用详细demo
  • @EventListener注解使用说明
  • [<死锁专题>]
  • [Bugku]密码???[writeup]
  • [C# 基础知识系列]专题十六:Linq介绍
  • [Google Guava] 1.1-使用和避免null
  • [HCTF 2018]WarmUp (代码审计)
  • [HEOI2013]ALO
  • [HTML API]HTMLCollection
  • [Java]快速入门二叉树,手撕相关面试题
  • [js]- 两个对象的合并(Object.assign)
  • [js高手之路] dom常用API【appendChild,insertBefore,removeChild,replaceChild,cloneNode】详解与应用...