欢迎光临散文网 会员登陆 & 注册

高频面试题,值传递和引用传递你遇到过吗?

2022-03-16 15:15 作者:千锋教育  | 我要投稿

hello大家好,我又和大家见面了,各位还记得上海千锋文哥吗?文哥最近带的班级毕业了,班里的学员都在面试找工作。通过大家的面试情况我们发现,企业针对java初级开发工程师的要求主要集中在对java基础知识点的考察。

所以如果你的java基础知识掌握得非常扎实牢固,拿一份理想的offer是不难的。这就要求各位童鞋们在学习的时候一定要注重基础知识的理解和掌握,切不可眼高手低,走马观花。

今天,文哥通过自己班级学员的面试情况,总结了一道非常高频的面试题分享给大家。这就是值传递和引用传递的理解。为什么文哥单拿这道题来讲解呢?因为班里的学员不止一个人被问到了这个问题(历届学员也经常被问到这个问题),所以你是不是要拍拍大腿认真看了?

好了,重点来了。

所谓传递,在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方法中最后输出的值是对象修改之后的属性值。这么说大家听懂了不咯?

好了,这就是文哥今天给大家分享的一道经典而又高频的面试题,希望对大家的java学习能够带来帮助。

2022新版Java高频面试题马上上线,不要错过~ 

点击千锋教育主页——动态



高频面试题,值传递和引用传递你遇到过吗?的评论 (共 条)

分享到微博请遵守国家法律