错题一: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没有任何影响。

 

posted @ 2023-03-31 15:46  谁知道水烫不烫  阅读(26)  评论(0编辑  收藏  举报