黑马程序员技术交流社区

标题: 程序内存图的问题 [打印本页]

作者: java陈辉    时间: 2013-12-14 22:23
标题: 程序内存图的问题
本帖最后由 java陈辉 于 2013-12-16 20:31 编辑

以下代码中i不是等于6吗?怎么打印的结果是等于4?这段程序的内存图是怎样画的?求助。
public class Test      
{
        public static void leftshift(int i, int j)
        {
                   i+=j;
        }
        public static void main(String args[])
        {
                int i = 4, j = 2;
                leftshift(i, j);
                System.out.println(i); 。
        }
}


作者: lyn    时间: 2013-12-14 22:39
主函数中的i和j都是在栈内存中开辟的内存空间,你leftshift函数返回值为空,即使调用,但i+=j这条语句的结果是不会返回的因此当你打印时还是一你主函数的变量i的值打印出来了
作者: 翼展哈哈    时间: 2013-12-14 22:51
楼主您好,打印输出的结果之所以不是您的预期,主要是因为楼主只是把i、j的值传递给了leftshift函数,leftshift函数中的i值确实变成6,main函数中i值并没有变化,因为main函数中i值和leftshift的i值在内存中并不是同一块。下面是内存图:

1.png (15.14 KB, 下载次数: 14)

1.png

作者: litaojisuanji    时间: 2013-12-14 23:15
运行时,由JVM调用main方法,main方法所在的类也就被加载到了方法区,然后JVM调用main方法,
main方法也就进栈了,在栈中声明两个变量i,j分别赋初值 ,再调用本类的leftshift方法,传入i,j的值, leftshift方法也就进栈了,算出i+j的和再赋给i, leftshift执行结束, leftshift方法弹栈。
再输出i,main方法结束,弹栈。
由于你 leftshift方法并没有返回i的值,所以i的值还没变。

无标题.png (19.19 KB, 下载次数: 12)

无标题.png

作者: java--周群    时间: 2013-12-14 23:16
首先有个错误,函数leftshift方法中已经传入了形参,那么在主函数调用的时候,就应该在主函数调用该方法的时候传入实参,而不是仍然传入i,j,   现在来说下打印4的原因,读程序首先main方法进栈内存开辟空间,里面有两个变量i = 4,j = 2;后来调用leftshift方法,leftshift 方法进栈内存开辟空间,把i赋值给i,把j赋值给j,运算结果是i+j,运算完毕,leftshift 方法出栈,然后执行输出语句,当然打印主函数中的i的值,结果为  4.  内存图条件限制没办法画,希望给你的解释你可以看的懂。




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