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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© java陈辉 中级黑马   /  2013-12-14 22:23  /  1257 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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); 。
        }
}

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

4 个回复

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

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

1.png

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
运行时,由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, 下载次数: 7)

无标题.png

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

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

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马