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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马等我! 初级黑马   /  2012-5-5 19:36  /  2869 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马等我! 于 2012-5-21 15:42 编辑

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);
        }
}

为什么输出的i值不是6?

12 个回复

正序浏览
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);
        }
}

为什么输出的i值不是6?
//这个问题设计到变量的生命周期问题
//你在一个方法中定义了2个变量,那个这2个变量的生命周期就是在这个局部的代码块
//就是我们所说的局部变量
//主函数只不过是将当前的值复制给了方法中的2个变量
//这个时候调用leftshift(),方法进栈,然后运行方法,然后方法出栈,那么在方法中的
//局部变量也随着结束,主函数依旧执行,访问的是主函数中的i,输出的是4,
//如何你想输出结果是6,你可以这样做
// public static void leftshift(int i, int j)
        {
                   i+=j;
                                   System.out.println(i);
        }
回复 使用道具 举报
本帖最后由 韩新凯 于 2012-5-6 13:07 编辑

public class Test      
{       static int i=4;//全局变量
        public static int leftshift(int j)
        {
                   i+=j;
                   return i;
        }
        public static void main(String args[])
        {
                int j = 2;
                leftshift(j);
                System.out.println(i);
        }
}
回复 使用道具 举报
安路凤 发表于 2012-5-5 20:23
嘿嘿 我说的不对哦
谢谢斑竹还给我分呢
不过 不许叫我凤姐

嗯 加油学习 十期见
回复 使用道具 举报
非常感谢啊。解答的很好。
回复 使用道具 举报
李南江 发表于 2012-5-5 20:03
凤姐请看正确答案··希望十期有幸和凤姐成为同学哦

成员变量作用于整个类中,在整个类中都可以访问。成 ...

嘿嘿 我说的不对哦:funk:
谢谢斑竹还给我分呢
不过 不许叫我凤姐:@
回复 使用道具 举报
安路凤 发表于 2012-5-5 19:46
因为你输出的是i值,
你的方法里根本没有返回值,
虽然你调用了方法,但是并没有取得返回值

凤姐请看正确答案··希望十期有幸和凤姐成为同学哦

成员变量作用于整个类中,在整个类中都可以访问。成员变量随着对象的建立而建立,存在于对象所在的堆内存中。成员变量有默认初始化值。
局部变量只定义在局部范围内,如:(函数内、语句内等)局部变量存在于栈内测中。作用的范围结束,变量空间会自动释放 局部变量没有默认初始化值。
回复 使用道具 举报
因为leftshift方法和main方法里都有i,两个函数里的i没有关联,你调用leftshift(i, j)时,只是将leftshift函数里的方法i赋值而已,main方法里的i没有变化
而你打印的i是main方法里的,i=4
回复 使用道具 举报
任睦强 来自手机 高级黑马 2012-5-5 19:59:37
地板
因为int是基本数据类型,他传递的是值,虽然在leftshift()方法中改变了i的值,但是i一出这个方法还是原来的值,方法内改变值不影响方法外的值。
回复 使用道具 举报
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); //这里的i在leftshift()内有效,虽然结果为i=6,但leftshift()运行完后,i=6就释放掉了,
                System.out.println(i); // 这里的i为主方法中的i
        }
}

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 很给力!

查看全部评分

回复 使用道具 举报
修改的代码
public class Test1     
{
        public static void leftshift(int i, int j)
        {
                   i+=j;
                   System.out.println("i="+i);
        }
        public static void main(String args[])
        {
                int i = 4, j = 2;

                leftshift(i, j);
               
        }
}
运行结果:i=6
回复 使用道具 举报
首先,你传参数进一个函数的时候,在java里是进行传值的而不是传引用的。
这是和C++的不同之处,C++可以使用&符进行传引用来改变参数实际的值,而java里面没有。

然后说说这段代码里的现象,先给i赋值为4,那么i变量存的就是4了,除非重新赋值。
因此在函数里进行操作,只是对i的一个拷贝值进行操作,不改变i实际的值。
如果楼主需要达到目的,可以将运算后的值重新赋给i,以函数调用的形式赋值,如:i=leftShift(i,j);但首先函数的返回类型要修改一下。

希望能帮到楼主。
回复 使用道具 举报
因为你输出的是i值,
你的方法里根本没有返回值,
虽然你调用了方法,但是并没有取得返回值
所以输出的也不是方法里运算以后的值,而是你在main方法里初始化的值
我给你改了一下代码
public static int leftshift(int i, int j)
      {
                 i+=j;
                 return i;   //这里要返回值
      }
      public static void main(String args[])
      {
              int i = 4, j = 2;
               
              System.out.println(leftshift(i, j));  //输出的是返回来的值
      }

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

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