Java题库练习
看如下代码块,请得出输出值
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);
}
}
答案:15 0 20
本题考查两个知识点:
- 局部变量名字会屏蔽点外作用域同名字变量
- 函数的参数传递问题
解析:在原代码上讲解吧首先看主函数,创建Test对象并调用first()方法,在此方法中,初始化了一个变量i(注意这是一个局部变量),并创建了一个Value对象,并把属性i赋值为25(初始值为15),接着将该对象及局部变量i传入方法Second(Value v,int i)。
注意函数参数的v,并不是之前的first()方法中创建的对象v。这里是为了混淆视听,可以做如下改变:
publicvoidsecond(Value tmp,inti){
i = 0;
tmp.i = 20;
Value val = newValue( );
tmp = val;
System.out.println(tmp.i+" "+i);
}
这个tmp其实相当于是一个指向原来first中的V这个对象的指针,也就是对v对象的引用而已。但是引用是会改变所指的地址的值的。所以此时v中的属性i 的值被改变为20。然后又创建了一个Value对象val,该对象的i属性为15,tmp对象指向了对象val,所以tmp.i=15,i=0。而此时v的i属性已经被改变为20。故答案如下:15 0 20