Java面试题求解

一个双鱼座的测开 2019-09-03 09:03:21
class Valhold{
public int i=10
}
public class Obparm{
public static void main(String argv{}){
Obparm o =new 0bparm();
o.amethod();
}


public void amethod (){
INT I=99
ValHold v =new ValHold();
v.i=30;
Another(v.i);
System.out.print(v.i);
}//End of amethod
public void another(ValHold v.int i){
i=0
v.i=20;
ValHold vh =new ValHold();
V = vh;
System.out.print(v.i);
System.out.print(v.i);
}//End of another;
}
运行结果是?
...全文
192 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 2 楼 你是小KS 的回复:
这个代码我想吐,结果大概是10 10 30
答案是10020
  • 打赏
  • 举报
回复
引用 3 楼 人生呐 的回复:
应该是10 10 20吧 说下思路:amethod方法里的v我们称v1,another中的参数v我们称v2;amothod中v.i=30,进入another函数,此时v2指向v1,v2.i=20,那么v1.i=20,然后v2=vh,vh.i=10,所以v2.i=10,输出两个10,another方法结束后,v1.i此时等于20
答案是10020
  • 打赏
  • 举报
回复
应该是10 10 20吧 说下思路:amethod方法里的v我们称v1,another中的参数v我们称v2;amothod中v.i=30,进入another函数,此时v2指向v1,v2.i=20,那么v1.i=20,然后v2=vh,vh.i=10,所以v2.i=10,输出两个10,another方法结束后,v1.i此时等于20
编程写手 2019-09-04
  • 打赏
  • 举报
回复
这个代码我想吐,结果大概是10 10 30
大·风 2019-09-04
  • 打赏
  • 举报
回复
代码看了想打人系列+1,给你整理下吧。加上注释

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分钟
心怀啊 2019-09-04
  • 打赏
  • 举报
回复
代码看了想打人系列。
最小动能! 2019-09-04
  • 打赏
  • 举报
回复
10 10 20 我严重怀疑你, 和 . 不分
  • 打赏
  • 举报
回复
引用 4 楼 weixin_42439274 的回复:
[quote=引用 3 楼 人生呐 的回复:]应该是10 10 20吧 说下思路:amethod方法里的v我们称v1,another中的参数v我们称v2;amothod中v.i=30,进入another函数,此时v2指向v1,v2.i=20,那么v1.i=20,然后v2=vh,vh.i=10,所以v2.i=10,输出两个10,another方法结束后,v1.i此时等于20
答案是10020[/quote] 嗯?你那another里面的方法输出的不都是v.i么

62,624

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧