A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈圳 高级黑马   /  2013-2-20 22:11  /  1151 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public static void main(String[] args)
    {
       int x=5,y=6;
       System.out.println("x="+x+":y="+y);
       int num=max(x,y);
       System.out.println(x);
    }
    public static int max(int x,int y)
    {
            if(x<y)
                    x=y;
            return x;
    }
听毕老师讲栈内存的结构,我知道x=5;他的过程是先去栈内存中找有没有5这个值,如果有,他就取来用,这也是引用.而函数max中的参数int x取了5的值,并在函数里改变了其值x=6;
为什么在主函数里再次输入时,x还是等于5;
假设:public age=10
堆内存中的引用Person p=new Person();
Person s=p;
s.age=20的话,s.age的值也相应改变了.而栈内存中的引用.为什么不会改变?

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

2 个回复

倒序浏览
这道题在脑子里走一遍流程便是:首先main函数进栈,压在最下面,然后在main函数中生成了x和y
这时main方法中用到了max(int x,int y)方法,所以max进栈了,它压在了main函数的上边,并把main中的x和y复制给了max中的x和y
这时栈中有两对x和y,一对在main方法中,一对在max方法中
执行完max()方法后将返回值返回给了main中的num,max方法就消亡弹栈了,其中的xy也随之消失,
最后main方法再执行System.out.println(x);实际上还是main方法自己的那个x,故打印5
执行完最后一句话,main方法完成,也弹栈消亡。
流程就这样,够详细了吧。。。

评分

参与人数 1技术分 +1 收起 理由
黄锦成 + 1

查看全部评分

回复 使用道具 举报
你的函数 public static int max(int x,int y)与主函数中的x,y没有任何关系,这些x,y都在栈中,但是不在一个区域中,max(int x,int y)用完了这个方法中的x,y就被释放了,
你下面这个例子是2个引用s和p指向了同一个对象,他们当然一起改变
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马