欢迎关注头条号:老顾聊技术
精品原创技术分享,知识的组装工
不同的程序设计,参数的传递分为按值传递和按引用传递。
按值传递表示方法接收是参数的值,而引用传递表示方法接收的是变量的地址。
小伙伴们是不是觉得这个应该很简单啊,JAVA按照传值原则的啊。那小伙伴们可以继续看下去,是不是和你理解的一样?
何为基本、引用类型呢?我们看一下划分
基本类型:
整型:byte,short,int,long
浮点型:float,double
字符型:char
布尔型:boolean
引用类型:
数组
类
接口
基本类型和引用类型的区别是什么呢?看下面的代码
int a=1;
String str = "hello";
上图:变量a为基本类型,值就直接保存到变量中。而str是引用类型,变量str保存的是对象的内存地址。我们一般叫str为引用类型,引用实际是指向实际对象,实际对象中保存的内容
上图执行结果
=====基本类型-a=1
因为Java是按照值传递的原则,在执行incr方法时,其实是把a的值传递给了参数b,在incr方法中,对b变量进行操作,跟变量a没有关系,所以变量a值未变。
这体现了Java参数传递是按照值传递的。
学生实体类
对学生年龄进行赋值
上图执行结果:
=====引用类型-学生:Student [name=张三, age=20]
studentA变量发送了改变,这是因为studentA变量存储的是引用地址,方法参数传递其实就是把这个引用地址的值传递方法参数stu,stu变量的值也是引用地址,对stu变量对Age进行赋值,直接影响实际的内存对象。从而间接影响了变量studentA,因为studentA也是引用地址,指向的同一个内存对象。
是不是感觉蛮简单的,很容易理解,那我们继续网下看。
上图的代码执行,应该是什么呢?很多小伙伴在这里就被坑了。我们看一下执行结果
=====引用类型-学生:Student [name=张三, age=10]
很多小伙伴们会以为studentA应该为null,这个是很错误的,我们用图来说明,就清楚了
其实stu=null,就是把stu变量里面的引用地址的值,改为null而已,没有对实际内存对象产生改变的,之前的studentA变量里面的引用地址是没有变的。
我们继续再看一个特殊的变量类型。
上图执行应该是什么呢?这个小伙伴也会在这里困惑,我们看一下执行结果
=====引用类型-str=iphone
这个执行结果是不是很意外,String类型是引用类型,参数s是引用地址 和 str的引用地址是一样的啊,把变量s改变了,应该str变量也会改变啊,怎么没有改变?
这个就是String类型的特殊的地方,对String类型的原话是
their values cannot be changed after they are created
意思就是String类型的一旦被创建,不能修改他的值,可以理解为final类型。其实上面代码的真实逻辑是对参数s进行赋值“华为”,不是把原来的“iphone”内存对象改变了,而是新建了一个内存对象“华为”,然后把这个新的内存对象地址赋值给变量s。而变量stu里面的引用地址是没有变的,还是指向的是“iphone”的内存地址。如图
小伙伴们看到这里,有没有感觉有点收获。有时候很简单的问题,其实也没那么简单,很考基本功的,嘿嘿,谢谢!!!
-End-
如有收获,请帮忙转发,您的鼓励是作者最大的动力,谢谢!
10几年的经验实战分享
相关微服务,分布式,高并发,高可用,企业实战,干货等原创文章正在路上
欢迎关注头条号:老顾聊技术
精品原创技术分享,知识的组装工
推荐阅读
1、你了解如何利用token方式实现分布式Session吗?
2、Mysql索引结构演变,为什么最终会是那个结构呢?让你一看就懂
11、分享一线互联网大厂分布式唯一ID设计 之 snowflake方案
15、如何永不迁移数据和避免热点? 根据服务器指标分配数据量(揭秘篇)
16、你知道怎么分库分表吗?如何做到永不迁移数据和避免热点吗?
18、你知道如何更新缓存吗?如何保证缓存和数据库双写一致性?
留言与评论(共有 0 条评论) |