你对值传递和引用传递的理解是什么?
今天,通过学员的面试情况,总结了一道非常高频的面试题分享给大家。这就是值传递和引用传递的理解。为什么单拿这道题来讲解呢?因为班里的学员不止一个人被问到了这个问题(历届学员也经常被问到这个问题),所以你是不是要拍拍大腿认真看了?
好了,重点来了。
所谓传递,在java中其实就是将实际参数赋值给形式参数。那么什么是值传递,什么又是引用传递呢?现在文哥先给你说说值传递。
值传递:方法在调用的时候,实际参数把它的值赋予给形式参数,但是形式参数的数据类型只能是基本数据类型和String。形式参数和实际参数在内存上是两个独立的变量,对形式参数的修改并不会影响实际参数的值(敲黑板,这点很重要)。概念搞清楚之后,我们一起来看下面的代码:
请问结果是多少?
很多同学可能不假思索的回答:100!因为passingParameter方法的内部对b值重新赋予了。事实上并不是你们想的那样。下面我们结合我们的定义和代码来画一张图:
我们现在解读一下这幅图的意思:
我们先看main方法,main方法里面将实际参数b传递给passingParameter方法的形式参数a,由于形式参数a是int类型,所以可以判定这是值传递。根据我们上面给值传递的定义,passingParameter(b);
这句代码里面的b的值只是int b = 10的复制品(或者说是化身)。所以不管passingParameter方法内部如何对这个复制品进行操作,永远也无法修改b本身的值。所以main方法里面的输出语句输出的是b值本身,也就是10。这么说大家听懂了不咯?
下面我们再看看看引用传递。
引用传递:指的是在方法调用时,传递的实际参数是java对象,也就是对象的内存空间的地址。而形式参数也会指向这一内存地址。注意被传递的形式参数的数据类型必须是引用数据类型(又敲黑板了,这点很重要)。概念理解清楚之后,我们再来看一段代码:
请问main方法执行之后输出的结果是多少?说18就对了。为了便于大家理解,我再画一幅图:
现在我们来解读一下这幅图的意思:
我们先看main方法,main方法中给passingParameter方法传递了一个student对象,由于passingParameter的形式参数是Java对象,故这种传递称之为引用传递。根据代码,main方法中new的student的对象是在堆内存中开辟空间并创建的,所以student这个变量指向了这个对象。根据引用传递的概念,传递的是对象的内存地址。由此可得passingParameter的形式参数student也指向了这个对象的内存地址,所以在passingParameter方法内部对age属性进行修改,是对实际参数和形式参数共同指向的那个对象进行修改。所以main方法中最后输出的值是对象修改之后的属性值。
相关推荐HOT
更多>>如何添加Java环境变量?
要添加Java环境变量,可以按照以下步骤:并安装Java开发工具包(JDK)、找到Java安装路径、设置JAVA_HOME环境变量、添加Java可执行文件路径到PATH...详情>>
2023-05-04 11:00:56从零开始学Java之String字符串的编码
对很多小白来说,可能不明白什么是字符编码,也不知道为什么要有字符编码,所以先来给大家简要地介绍一下字符编码。详情>>
2023-05-04 10:21:02新手速来!几步带你掌握MyBatis Plus
Mybatis-Plus(简称MP)是一款Mybatis的增强工具,它是在Mybatis的基础上实现的简化开发工具。Mybatis-Plus给我们提供了开箱即用的CRUD操作、自动...详情>>
2023-04-28 10:57:09学习java需要什么基础?基础知识有哪些?
网络编程:了解基本的网络编程概念和协议,熟悉 Java 网络编程 API。建议在学习 Java 之前,先学习一些基础的编程语言,如 C 或 Python 等,这...详情>>
2023-04-28 10:41:14