面试官:你好,你能说出下面个程序的执行结果吗?

public class Test {public static void main(String[] args) {String name = "Scott";int age = 5;User user = new User();user.setName(name);user.setAge(age);System.out.println("before change user = " + user);change(user, name, age);System.out.println("name = " + name);System.out.println("age = " + age);System.out.println("after change user = " + user);}public static void change(User user, String name, int age) {name = "Tom";age = 20;user.setName(name);user.setAge(age);}static class User {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "{name : " + name + ", age : " + age + "}";}}
}

:执行结果是:

面试官:恩,你的答案完全正确。age是一个基本类型变量,User、String都是引用类型变量,但是在调用change()方法之后,实参name和age都没有改变,而user对象改变了。那么可不可以说调用change()方法时,User对象是引用传递,age是值传递?可是String的传递方式又是什么呢?它的表现和age相同,但本身确是引用对象,这该如何解释呢?

:Java和C++不同,C++中有引用传递的函数调用方式,而Java中只有值传递

首先,值传递的官方解释是:

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

其次,引用传递的官方解释是:

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

一句话概括值传递和引用传递的区别:

值传递是传递实参副本,函数修改不会影响实参;引用传递是传递实参地址,函数修改会影响实参。

面试官:恩,那你可不可以结合上面的程序题,解释一下这句话呢?

:好的。针对于上面程序的应用场景,在调用change()方法的时候,user、name、age三个变量都是值传递

其中,user对象是将引用拷贝了一份,引用是对象的地址,change()中对user的修改,并没有影响到这个地址,而是修改了对象属性。产生混淆的关键在于人们看到对象本身被函数修改了,就错误的认为这是引用传递。但我们区分值传递还是引用传递的关键在于实参是否被函数所修改,对于user对象来说地址才是实参!但如果你在change()方法中修改user引用的地址,即新创建一个新的user对象的话,就会看到main方法中的user并没有任何改变,也就反向印证了它实际上是值传递。

name变量自然也是将name引用拷贝一份传递给change()方法,根据值传递的定义,函数对这个副本的修改不会影响到实际参数,又因为String的final特性,name = "Tom"; 实际上就是修改了name的地址,因此,实际参数不会受函数修改的影响。

age其本身也是将数值拷贝一份传入change(),所以任何修改都不会影响到实参。所以我们说,在Java中只有值传递这一种参数传递方式。

面试官:恩,你的理解已经非常到位了,那额外问一句,对于上面的三种类型User、String、int,当输出结果如何时,才可以认定是引用传递呢?

:对于User对象,上面的代码实际上并不能很好的验证这个问题,反而给人一种对象即是实参的假象。实际上,如果调用change()方法后,重新new 一个User对象后赋值给user,即改变了变量的地址。在这种情况下,main中如果可以成功打印出新对象的话,才可以认定是引用传递。

String类型的name也是一样,如果在change()中 name = "Tom"; main中如果可以打印出 Tom 的话才可以认为是引用传递。

包括age变量,尽管它是一个基本类型变量,但在内存中,依然有地址和数据的区分,如果在change()中的修改,main中可以看到的话,才可以说是引用传递。

实际上,“引用传递”中的“引用”二字,绝对不能简单的理解为“引用类型”中的“引用”,而应该理解为“指针”、“地址”,Java中就算是基本类型也同样拥有“地址”和“指针”。

当面试官问我————Java是值传递还是引用传递?相关推荐

  1. 【020期】面试官问:Java 遍历 Map 集合有几种方式?效率如何?

    >>号外:关注"Java精选"公众号,回复"2021面试题",领取免费资料!"Java精选面试题"小程序,3000+ 道面试题在 ...

  2. 面试官问你Java线程池--怎么样回答才能让面试官知道你真的懂了!

    一.引言 不管是Java面试还是Android面试,线程池都是面试官高频考察的点,那我们怎么回答,才能让面试官了解到我们是真的懂Java线程池了呢?这篇文章不涉及到线程池的使用和原理,如果你还不知道怎 ...

  3. 面试官问你Java内存区域你用new创建对象来解释

    这几天研究Java虚拟机(Java Virtual Machine),不得不说,这玩意真牛掰,Java跨平台真不是盖的,JVM的学习,今天就从内存区域开始,Java虚拟机他有自己管理的一块内存区域,并 ...

  4. 腾讯面试官问我Java中boolean类型占用多少个字节?我说一个,面试官让我回家等通知...

    来自:程序员乔戈里 ---------------第二天-------------- 什么是boolean类型,根据官方文档的描述[1]: boolean: The boolean data type ...

  5. 为什么线程池里的方法会执行两次_面试官问你java都有哪些线程池,自己是否自定义过线程池...

    我还记得大学实习面试时,被问到什么是线程池这个问题,因为这个题我被录取了,原因就是我背出来了,而另外一个面试的没背出来,说实话当时还真不知道它是干什么的,就是看面试题给背下来了,在之后就是在实际开发中 ...

  6. 【微信小程序】被面试官问的Java问题难倒了

    Kafka的多副本冗余设计 不管是传统的基于关系型数据库设计的系统,还是分布式的如zookeeper.redis.Kafka.HDFS等等,实现高可用的办法通常是采用冗余设计,通过冗余来解决节点宕机不 ...

  7. 什么?面试官问我Java内存模型!这不得给我加薪?

    内存模型的基础 通信 线程之间以何种机制来交换信息 共享内存 隐式通信 消息传递 显示通信 同步 程序中用于控制不同线程间操作,发生的相对顺序的机制 共享内存 显式同步 消息传递 隐式同步 Java线 ...

  8. 面试官:说说Java对象的四种引用方式

    我们知道在Java中除了基础的数据类型以外,其它的都为引用类型. 而Java根据其生命周期的长短将引用类型又分为强引用.软引用.弱引用.幻象引用 . 正常情况下我们平时基本上我们只用到强引用类型,而其 ...

  9. 【059期】面试官问:序列化是什么,为什么要序列化,如何实现?

    >>号外:关注"Java精选"公众号,回复"面试资料",免费领取资料!"Java精选面试题"小程序,3000+ 道面试题在线刷, ...

最新文章

  1. html的子页面获取自己url,如何从html页面获取url参数并将其显示在textarea中?
  2. 小红书增长负责人:精确化营销如何玩
  3. 终于有了属于自己的家,哈哈,很高兴~~
  4. php手机接口购物车怎么实现,php购物车的实现原理
  5. 如何实现 OpenAPI 多语言 SDK 开发?
  6. 作者:高翔(1984-),男,国防大学信息作战与指挥训练教研部博士后,主要研究方向为体系分析与超网建模。...
  7. strlen函数实现
  8. bzoj1923 [Sdoi2010]外星千足虫 压位+高斯消元
  9. 机器学习笔记(六):数据归一化 | 凌云时刻
  10. Android mc怎么和win10联机,大更新我的世界手机版/win10版联机完美互通
  11. 【搬运】 Cadence orcad常用库olb介绍
  12. 3D图形渲染及数字图像处理算法相关文集
  13. 探索反汇编-在Linux环境下
  14. 程序员如何不加班?—— 时间管理篇
  15. php主机字节序和网络字节序
  16. OpenSSL源码下载及编译
  17. 基于51单片机的智能大棚光温控制系统
  18. python虎扑社区论坛数据爬虫分析报告
  19. PyTorch安装测试训练建自己的数据集
  20. 教程 | 虚拟机VMware Workstation Pro安装教程

热门文章

  1. Java Long类shortValue()方法与示例
  2. kotlin字符串数组_Kotlin程序读取,遍历,反向和排序字符串数组
  3. JAVA基础之容器基础内容
  4. 八、华为鸿蒙HarmonyOS应用开发之Java UI框架、常用TextField组件使用
  5. MFC串口通信设置及发送、中断接收程序
  6. vue数组刷新_Vue中数组更新后,页面没有动态刷新问题
  7. 认识和选购极致的显示器
  8. java可以返回微妙吗_Java开发中10个最为微妙的最佳编程实践
  9. jq ajax提交评论,织梦评论怎么改成自己的jq ajax评论
  10. 计算机语言史话论文,【论文节选】自然语言处理发展历史。