@onsubmit 向方法传递参数_面试题:JAVA方法参数传递方式?简约而不简单

欢迎关注头条号:老顾聊技术

精品原创技术分享,知识的组装工


目录

  1. 前言
  2. 基本与引用类型
  3. 案例一
  4. 案例二
  5. 案例三
  6. 案例四
  7. 总结

前言

不同的程序设计,参数的传递分为按值传递和按引用传递。

按值传递表示方法接收是参数的值,而引用传递表示方法接收的是变量的地址

小伙伴们是不是觉得这个应该很简单啊,JAVA按照传值原则的啊。那小伙伴们可以继续看下去,是不是和你理解的一样?

基本与引用类型

何为基本、引用类型呢?我们看一下划分

基本类型:

整型:byte,short,int,long浮点型:float,double字符型:char布尔型:boolean

引用类型:

数组类接口

基本类型和引用类型的区别是什么呢?看下面的代码

int a=1;String str = "hello";
1abdfe2f39420188c960fc8273fc7243.png

上图:变量a为基本类型,值就直接保存到变量中。而str是引用类型,变量str保存的是对象的内存地址。我们一般叫str为引用类型,引用实际是指向实际对象,实际对象中保存的内容

案例一

e87b35f80bacd16e33ae16e93143766a.png

上图执行结果

=====基本类型-a=1

因为Java是按照值传递的原则,在执行incr方法时,其实是把a的值传递给了参数b,在incr方法中,对b变量进行操作,跟变量a没有关系,所以变量a值未变。

ef4dbaa074d8a8613874914b5b87e8b0.png

这体现了Java参数传递是按照值传递的。

案例二

c4c1b0efac38aec094455f742c887d8b.png

学生实体类

c11e07519592ae12b53d0ee4c709d032.png

对学生年龄进行赋值

上图执行结果:

=====引用类型-学生:Student [name=张三, age=20]

studentA变量发送了改变,这是因为studentA变量存储的是引用地址,方法参数传递其实就是把这个引用地址的值传递方法参数stustu变量的值也是引用地址,对stu变量对Age进行赋值,直接影响实际的内存对象。从而间接影响了变量studentA,因为studentA也是引用地址,指向的同一个内存对象

c8f8708ac8d3b69112448a2b434ee480.png

是不是感觉蛮简单的,很容易理解,那我们继续网下看。

案例三

7c3d212b9fddcc652beb8e58b0bc5f98.png

上图的代码执行,应该是什么呢?很多小伙伴在这里就被坑了。我们看一下执行结果

=====引用类型-学生:Student [name=张三, age=10]

很多小伙伴们会以为studentA应该为null,这个是很错误的,我们用图来说明,就清楚了

875d07655b61b548311e74f7ce446b52.png

其实stu=null,就是把stu变量里面的引用地址的值,改为null而已没有对实际内存对象产生改变的,之前的studentA变量里面的引用地址是没有变的。

我们继续再看一个特殊的变量类型。

案例四

20214f2538947ba43ccd8c2660ebc6b3.png

上图执行应该是什么呢?这个小伙伴也会在这里困惑,我们看一下执行结果

=====引用类型-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”的内存地址。如图

68951f3372f1794a57c62a97d32d9c1d.png

总结

小伙伴们看到这里,有没有感觉有点收获。有时候很简单的问题,其实也没那么简单,很考基本功的,嘿嘿,谢谢!!!


-End-

如有收获,请帮忙转发,您的鼓励是作者最大的动力,谢谢!

10几年的经验实战分享

相关微服务,分布式,高并发,高可用,企业实战,干货等原创文章正在路上

欢迎关注头条号:老顾聊技术

精品原创技术分享,知识的组装工

推荐阅读

1、你了解如何利用token方式实现分布式Session吗?

2、Mysql索引结构演变,为什么最终会是那个结构呢?让你一看就懂

3、一场比赛涉及到的知识,用通俗易通的方式介绍并发协调

4、企业实战Redis全方面思考,你思考了吗?

5、面试题:Thread的start和run的区别

6、面试题:什么是CAS?CAS的作用以及缺点

7、如何访问redis中的海量数据?避免事故产生

8、如何解决Redis热点问题?以及如何发现热点?

9、如何设计API接口,实现统一格式返回?

10、你真的知道在生产环境下如何部署tomcat吗?

11、分享一线互联网大厂分布式唯一ID设计 之 snowflake方案

12、分享大厂分布式唯一ID设计方案,快来围观

13、你想了解一线大厂的分布式唯一ID生成方案吗?

14、你知道如何处理大数据量吗?(数据拆分篇)

15、如何永不迁移数据和避免热点? 根据服务器指标分配数据量(揭秘篇)

16、你知道怎么分库分表吗?如何做到永不迁移数据和避免热点吗?

17、你了解大型网站的页面静态化吗?

18、你知道如何更新缓存吗?如何保证缓存和数据库双写一致性?

19、你知道怎么解决DB读写分离,导致数据不一致问题吗?

20、DB读写分离情况下,如何解决缓存和数据库不一致性问题?

21、你真的知道怎么使用缓存吗?

22、如何利用锁,防止缓存击穿?重构思想的重要性

23、海量订单产生的业务高峰期,如何避免消息的重复消费?

24、你知道如何保障生产端100%消息投递成功吗?

25、微服务下的分布式session该如何管理?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值