以下是引用wtyl0088在2006-5-7 23:22:00的发言:
对于这道题的一点看法
答案是d
class Test{
public int i=10;
}
public class ObParm{
public static void main(String argv[]){
ObParm o=new ObParm();
o.amethod();//首先让我们看这里 o 调用了方法amethod
}
public void amethod(){
int i=99;//一个重新定义的局部变量与前面的i 没什么关系
Test v=new Test();//实例化
v.i=30;//将v的属性i 该为30
another(v,i);//问题出来了 这里一共有两个参数 一个是 对象 一个是普通变量
System.out.println(v.i);
}
public void another(Test v, int i){//再来看这里
i=0;//首先另那个 int i=99 变成 i=0;
v.i=20;//这里另对象的i属性为20
Test vh=new Test();
v=vh;//这里把一个新生成的实例 附给了 v 这样 v 就指向了 vh 的那片地址
System.out.println(v.i+" "+i);//这里输出 v.i=20 因为已经被改过了 而 i 也就变成了 0
}
}
问题就上最后一个了
因为大家可能对于 java 的传递参数有些不明白
java中所有的传递方式都是传值 对于普通变量 就是把自己的副本传了进去 所以程序推出的时候 那个变量还是没有变化
而 对于向 数组和对象这类的 他们传的是地址 地址是不能被改变的 但是地址所指向的内容是可以改的
就向本题中虽然把(v=vh)但推出方法的时候 v 并没有发生变化 而他指的内容 也就是i 是可以改变的 这里变成了 20
所以正确答案是 D
10 0 20
不知道这样大家能否理解
对于这道题的一点看法
答案是d
class Test{
public int i=10;
}
public class ObParm{
public static void main(String argv[]){
ObParm o=new ObParm();
o.amethod();//首先让我们看这里 o 调用了方法amethod
}
public void amethod(){
int i=99;//一个重新定义的局部变量与前面的i 没什么关系
Test v=new Test();//实例化
v.i=30;//将v的属性i 该为30
another(v,i);//问题出来了 这里一共有两个参数 一个是 对象 一个是普通变量
System.out.println(v.i);
}
public void another(Test v, int i){//再来看这里
i=0;//首先另那个 int i=99 变成 i=0;
v.i=20;//这里另对象的i属性为20
Test vh=new Test();
v=vh;//这里把一个新生成的实例 附给了 v 这样 v 就指向了 vh 的那片地址
System.out.println(v.i+" "+i);//这里输出 v.i=20 因为已经被改过了 而 i 也就变成了 0
}
}
问题就上最后一个了
因为大家可能对于 java 的传递参数有些不明白
java中所有的传递方式都是传值 对于普通变量 就是把自己的副本传了进去 所以程序推出的时候 那个变量还是没有变化
而 对于向 数组和对象这类的 他们传的是地址 地址是不能被改变的 但是地址所指向的内容是可以改的
就向本题中虽然把(v=vh)但推出方法的时候 v 并没有发生变化 而他指的内容 也就是i 是可以改变的 这里变成了 20
所以正确答案是 D
10 0 20
不知道这样大家能否理解
这位大虾分析的的确很精妙,但我还是有一点不是很清楚,为什么第一个输出是10呢 ?
System.out.println(v.i+" "+i);//这里输出 v.i=20 因为已经被改过了 而 i 也就变成了 0
作者说V.i=20因为已经被改过~我也知道被改过了,但改成什么了我却不清楚~~10是怎么得出来的我也莫名其妙!!
坚持自己的选择!向着理想迈出了第一步!