java值传递和引用传递的区别?举例一些常见都笔试面试题说明,最后有速记口诀

java值传递和引用传递的区别?举例一些常见都笔试面试题说明,最后有速记口诀 java值传递和引用传递的区别?举例一些常见都笔试面试题说明,最后有速记口诀先说结论Java 里只有值传递没有真正的引用传递。很多人会混淆是因为基本类型传的是“值的副本”对象传的是“引用的副本”注意对象传的是引用的副本不是引用传递。1. 值传递和引用传递到底区别是什么值传递把实参的值复制一份给形参。方法里改形参不会直接改掉调用者手里的那个变量。引用传递把“变量本身”交给方法。方法里如果改了这个引用绑定的对象甚至让它指向别处调用者也会跟着变。Java 没有这种“真正的引用传递”。2. Java 里到底怎么传基本类型例如int、double、char传的是数值副本。publicclassDemo{publicstaticvoidadd(intx){x;}publicstaticvoidmain(String[]args){inta10;add(a);System.out.println(a);// 10}}原因add里拿到的是a的副本x改的是x不是a。引用类型例如String、数组、普通对象传的是“引用的副本”。classPerson{Stringname;}publicclassDemo{publicstaticvoidchange(Personp){p.nameAlice;}publicstaticvoidmain(String[]args){PersonpnewPerson();p.nameBob;change(p);System.out.println(p.name);// Alice}}这里为什么变了p里存的是对象地址调用方法时把这个地址复制一份给了形参两个引用都指向同一个对象所以改对象内部状态外面能看到但这依然是值传递因为传过去的是“地址这个值”的副本。3. 最容易考的面试陷阱题1基本类型一定改不动publicstaticvoidchange(intx){x100;}publicstaticvoidmain(String[]args){inta10;change(a);System.out.println(a);}结果10题2改对象属性外面能看到classStudent{intage;}publicstaticvoidchange(Students){s.age20;}publicstaticvoidmain(String[]args){StudentsnewStudent();s.age10;change(s);System.out.println(s.age);}结果20题3方法里把参数指向新对象外面不变classStudent{intage;}publicstaticvoidchange(Students){snewStudent();s.age20;}publicstaticvoidmain(String[]args){StudentsnewStudent();s.age10;change(s);System.out.println(s.age);}结果10原因方法里只是让“形参副本”指向了新对象外面的s还指向原来的对象这题是面试最爱问的。题4String 为什么改不掉publicstaticvoidchange(Stringstr){strstr world;}publicstaticvoidmain(String[]args){Stringshello;change(s);System.out.println(s);}结果hello原因有两层Java 还是值传递String不可变str world会产生新对象只改了形参的指向题5数组元素能改但整个数组换掉不行publicstaticvoidchange(int[]arr){arr[0]99;}publicstaticvoidmain(String[]args){int[]a{1,2,3};change(a);System.out.println(a[0]);// 99}能改元素因为操作的是同一个数组对象。再看publicstaticvoidchange(int[]arr){arrnewint[]{9,9,9};}publicstaticvoidmain(String[]args){int[]a{1,2,3};change(a);System.out.println(a[0]);// 1}不能改外面的引用因为只是改了形参副本。题6交换两个值为什么失败publicstaticvoidswap(inta,intb){inttempa;ab;btemp;}publicstaticvoidmain(String[]args){intx1,y2;swap(x,y);System.out.println(x, y);}结果1, 2因为交换的是副本不是原变量。这题常引出结论Java 不能像 C 引用参数那样直接交换调用者的两个基本类型变量。4. 面试里最标准的一句话如果面试官问“Java 是值传递还是引用传递”标准答法Java 永远是值传递。对于基本类型传的是值本身对于对象类型传的是对象引用的副本。5. 一张表记住参数类型传递内容方法内修改是否影响外部变量方法内修改对象内容是否影响外部基本类型值的副本否不适用引用类型引用的副本否是6. 面试高频误区“Java 对象是引用传递”错。是引用的值传递。“方法里new一个对象外面也会变”错。只改了形参指向。“String 传进去后改不了说明不是引用类型”错。String是引用类型只是它不可变。7. 最后给你一个背诵版Java 只有值传递。基本类型传值副本引用类型传引用副本。所以改对象内容能影响外部改引用指向不能影响外部。可以直接背这版。口诀版Java 只有值传递绝无引用传递。基本类型传数值对象类型传地址副本。改值不影响外面改对象内容可能影响外面。改引用指向没用new了对象也带不出去。String看着像能改其实不可变。数组、对象看同理改内部可以换整体不行。面试答题模板如果面试官问“Java 到底是值传递还是引用传递”标准回答直接说Java 永远是值传递。基本类型传的是值的副本引用类型传的是引用的副本。因此方法内修改对象的成员变量外部可能看到变化但让形参重新指向新对象外部不会变。高频判断口诀int、double、char改形参外面不变对象.属性 xxx外面通常会变形参 new Xxx()外面不变形参 另一个对象外面不变arr[0] ...外面会变arr new int[]{...}外面不变str str x外面不变笔试速判四字诀看你改谁改“对象里面的东西”可能影响外面改“形参本身指向”一定不影响外面最短背诵版Java 只有值传递。基本类型传值对象类型传引用副本。能改对象内容不能改外部引用指向。