62,628
社区成员
发帖
与我相关
我的任务
分享
public class Obparm {
public static void main(String[] args) {
Obparm o = new Obparm();
o.amethod();
}
public void amethod(){
int I = 99;
// 假如此时创建方法V在堆中地址a
Valhold v = new Valhold();
// 此时在[amethod方法栈]中v指向的是地址a
// 修改的是[内存地址a]的Valhold的值
v.i = 30;
// 将a的地址传递到[another方法栈]
another(v);
// 输出的是内存地址a的Valhold的值
System.out.println(v.i);
}//End of amethod
public void another(Valhold v){
int i = 0;
// 此时v指向的是地址a
// 修改的是[内存地址a]的Valhold的值
v.i = 20;
// 假如此时创建方法vh在堆中地址b
Valhold vh =new Valhold();
// 此时修改的是[amethod方法栈]v的引用
v = vh;
System.out.println(v.i);
System.out.println(v.i);
}//End of another;
}
class Valhold{
public int i = 10;
}
这里面主要看你理解不理解堆栈、引用和赋值。
你在amethod方法栈中的v只是保存了一个内存地址指向的是创建的Valhold,虽然你在another方法中修改了v的引用地址,
但是你只是修改了another方法栈的引用位置,因为栈之间是隔离的,你并没有修改amethod方法栈中的v。
所以在amethod方法中打印的还是之前的对象,而another则是第二个对象。
另外你之所以能在another中修改v指向的对象的值,是因为创建的Valhold(v,vh )都在堆中。
这个你可以想象一个场景。
你和老板都住在A小区。
你跟老板说我到公司(这在堆里面,大家都知道)要30分钟太远了。
然后老板决定把公司(修改堆中的值)搬近10分钟的距离。
然后老板决定开个分公司,他去分公司上班,离住的地方只有10分钟(此时修改了他自己对公司的索引,你并不知道)。
但是这个时候外人问起通勤时间。
老板回答到公司通勤10分钟
你回答到公司通勤20分钟