黑马程序员技术交流社区

标题: 函数参数中的引用变量的值的疑惑 [打印本页]

作者: 陈圳    时间: 2013-2-20 22:11
标题: 函数参数中的引用变量的值的疑惑
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的值也相应改变了.而栈内存中的引用.为什么不会改变?

作者: 王钊    时间: 2013-2-20 22:24
这道题在脑子里走一遍流程便是:首先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方法完成,也弹栈消亡。
流程就这样,够详细了吧。。。
作者: 李挺    时间: 2013-2-20 22:28
你的函数 public static int max(int x,int y)与主函数中的x,y没有任何关系,这些x,y都在栈中,但是不在一个区域中,max(int x,int y)用完了这个方法中的x,y就被释放了,
你下面这个例子是2个引用s和p指向了同一个对象,他们当然一起改变




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2