这两天,在网上逛的时候,发现了以下的一道面试题,感受还有蛮有意思的,要是不仔细看还真容易掉到坑里面。第一眼看起来比较绕,因此比较难理解。最终我跳出了这个坑,也想把这个跳坑的经历分享出来。题目以下 , 请问输出的是什么?为何?html
/**
* @author hafiz.zhang
* @description: 一个奇怪的现象
* @date Created in 2018/7/2 22:44.
*/
public class Test {
public static void main(String[] args) {
String ermao = "a";
String bb = addStr(ermao);
System.out.println(ermao);
}
private static String addStr(String ermao) {
ermao = ermao + "b";
return ermao;
}
}
毫无疑问,这道题的答案是:a , 你答对了么?在讲解缘由以前,让咱们想了解一点基础知识吧:java
其实,Java官方并无给出值传递仍是引用传递的概念。官方将Java参数传递类型分为传递基本类型参数和传递引用类型参数。当参数为基本类型(Java八大基本类型:int、short、float、double、long、boolean、byte、char)的时候,就是传递基本类型参数了,当参数为封装类型(非基本类型,如Integer、Long、Boolean等)的时候,就是传递引用传递参数了。官方文档地址:Java参数传递。面试
从Java的底层机制来讲,基本类型的变量存放在栈里;封装类型中,对象放在堆里,对象的引用放在栈里。Java在方法传递参数时,是将变量复制一份,而后传入方法体去执行。数组
由于String类型在传递过程当中的步骤以下:oracle
还不清晰?不要紧,那咱们直接上个图会不会来得更直观:app
经过本文咱们就理解了Java在方法传参的整个过程。其实仍是上面那句比较重要的话Java在方法传递参数时,是将变量复制一份,而后传入方法体去执行。给棒棒哒本身一波掌声👏👏👏,点滴积累,方成大事~学习