当前位置: 技术问答>java相关
关于参数传递的一道SCJP题?疑惑
来源: 互联网 发布时间:2015-03-02
本文导语: 请看下面的程序: class ValHold { public int i = 10; } class SL275 { public static void main(String argv[]) { SL275 o = new SL275(); o.amethod(); } public void amethod() { int i = 99; ValHold v = new...
请看下面的程序:
class ValHold
{
public int i = 10;
}
class SL275
{
public static void main(String argv[])
{
SL275 o = new SL275();
o.amethod();
}
public void amethod()
{
int i = 99;
ValHold v = new ValHold();
v.i=30;
another(v,i);
System.out.println(v.i);//关键问题在这句话
}
public void another(ValHold v, int i)
{
i=0;
v.i = 20;
ValHold vh = new ValHold();
v = vh;
System.out.println(v.i+ " "+i);
}
}
我自己写出的结果是10 0 10
而正确答案是10 0 20
Java参数传递我是知道的,当参数为变量时传递值,为对象时传递地址。可是这道题关键在有注释的地方。我觉得对象v已经在another()里被指向了对象vh的首地址,那么再访问v.i的时候应该是10了啊。你们看看,为什么会是20啊?
class ValHold
{
public int i = 10;
}
class SL275
{
public static void main(String argv[])
{
SL275 o = new SL275();
o.amethod();
}
public void amethod()
{
int i = 99;
ValHold v = new ValHold();
v.i=30;
another(v,i);
System.out.println(v.i);//关键问题在这句话
}
public void another(ValHold v, int i)
{
i=0;
v.i = 20;
ValHold vh = new ValHold();
v = vh;
System.out.println(v.i+ " "+i);
}
}
我自己写出的结果是10 0 10
而正确答案是10 0 20
Java参数传递我是知道的,当参数为变量时传递值,为对象时传递地址。可是这道题关键在有注释的地方。我觉得对象v已经在another()里被指向了对象vh的首地址,那么再访问v.i的时候应该是10了啊。你们看看,为什么会是20啊?
|
首先,在another方法中,
有一句v.i=20;这句修改的是v实例所指的内存空间中的i的内容,
后一句v=vh,把v指向vh的内存地址,
所以,System.out.println(v.i+""+i);是10 0,
但是,由于v是对象,所以,当除了这个方法以后,
它所指的内存地址是不变的,
还是没有进方法前的地址,
所以v.i是20;
对象本身不能变,
但是对象所指的内容可以改变。
有一句v.i=20;这句修改的是v实例所指的内存空间中的i的内容,
后一句v=vh,把v指向vh的内存地址,
所以,System.out.println(v.i+""+i);是10 0,
但是,由于v是对象,所以,当除了这个方法以后,
它所指的内存地址是不变的,
还是没有进方法前的地址,
所以v.i是20;
对象本身不能变,
但是对象所指的内容可以改变。
|
class SL275
{
public static void main(String argv[])
{
SL275 o = new SL275();
o.amethod();
}
public void amethod()
{
int i = 99;
ValHold v = new ValHold();
v.i=30; //change the variable(i) value to 30
another(v,i); //this statement set v.i to 20
System.out.println(v.i);//关键问题在这句话
}
public void another(ValHold v, int i)
{
i=0;
v.i = 20; //change variable value to 20. It's in the origin instance created in amethod.
ValHold vh = new ValHold(); //create a new instance, differ from the one created in amethod()
v = vh; //point to a new instance, it's different from the origin one now.
System.out.println(v.i+ " "+i); //print10 0
}
}
{
public static void main(String argv[])
{
SL275 o = new SL275();
o.amethod();
}
public void amethod()
{
int i = 99;
ValHold v = new ValHold();
v.i=30; //change the variable(i) value to 30
another(v,i); //this statement set v.i to 20
System.out.println(v.i);//关键问题在这句话
}
public void another(ValHold v, int i)
{
i=0;
v.i = 20; //change variable value to 20. It's in the origin instance created in amethod.
ValHold vh = new ValHold(); //create a new instance, differ from the one created in amethod()
v = vh; //point to a new instance, it's different from the origin one now.
System.out.println(v.i+ " "+i); //print10 0
}
}