错题一:java中的值传递与引用传递
考察的知识点:在java中,原始数据类型的传递都是值传递,传递的是值的副本,形参改变对实参没有影响;引用传递传递的是引用类型数据(传递的是内存地址),如String、Map、类对象等,因此形参发生变化实参也会随之变化。
原始题目:
class Value{ public int i=15; } public class Test{ public static void main(String argv[]){ Test t=new Test( ); t.first( ); } public void first( ){ int i=5; Value v=new Value( ); v.i=25; second(v,i); System.out.println(v.i); } public void second(Value v,int i){ i = 0; v.i = 20; Value val = new Value( ); v = val; System.out.println(v.i+" "+i); } }
-
A 15 0 20
-
B 15 0 15
-
C 20 0 20
-
D 0 15 20
答案是选A。
我当时的选择是B,当时想的是v不是指向val了吗,那它的i值不应该是15吗,怎么会是20?然而当我又仔细看了一下时,我瞬间就明白了。这里我犯错误的原因是形参v跟实参v同名导致我有些混乱了。当时把形参v当成了实参v,实际上形参v跟实参v指向的是同一个内存地址,当(形参)v.i=20时,实参v的i也变成了20,但是(形参)v = val,是让形参v指向了一个新的内存地址(val指向的内存地址),然而对实参v没有任何影响。