黑马程序员技术交流社区

标题: 疑问,求解(已解决) [打印本页]

作者: 黑马等我!    时间: 2012-5-5 19:36
标题: 疑问,求解(已解决)
本帖最后由 黑马等我! 于 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?

作者: 安路凤    时间: 2012-5-5 19:46
因为你输出的是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));  //输出的是返回来的值
      }
作者: 云惟桉    时间: 2012-5-5 19:50
首先,你传参数进一个函数的时候,在java里是进行传值的而不是传引用的。
这是和C++的不同之处,C++可以使用&符进行传引用来改变参数实际的值,而java里面没有。

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

希望能帮到楼主。
作者: Friends★    时间: 2012-5-5 19:54
修改的代码
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
作者: 魏涞    时间: 2012-5-5 19:54
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
        }
}

作者: 任睦强    时间: 2012-5-5 19:59
因为int是基本数据类型,他传递的是值,虽然在leftshift()方法中改变了i的值,但是i一出这个方法还是原来的值,方法内改变值不影响方法外的值。
作者: 谭景宾    时间: 2012-5-5 20:02
因为leftshift方法和main方法里都有i,两个函数里的i没有关联,你调用leftshift(i, j)时,只是将leftshift函数里的方法i赋值而已,main方法里的i没有变化
而你打印的i是main方法里的,i=4
作者: 攻城狮    时间: 2012-5-5 20:03
安路凤 发表于 2012-5-5 19:46
因为你输出的是i值,
你的方法里根本没有返回值,
虽然你调用了方法,但是并没有取得返回值

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

成员变量作用于整个类中,在整个类中都可以访问。成员变量随着对象的建立而建立,存在于对象所在的堆内存中。成员变量有默认初始化值。
局部变量只定义在局部范围内,如:(函数内、语句内等)局部变量存在于栈内测中。作用的范围结束,变量空间会自动释放 局部变量没有默认初始化值。
作者: 安路凤    时间: 2012-5-5 20:23
李南江 发表于 2012-5-5 20:03
凤姐请看正确答案··希望十期有幸和凤姐成为同学哦

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

嘿嘿 我说的不对哦:funk:
谢谢斑竹还给我分呢
不过 不许叫我凤姐:@
作者: 黑马等我!    时间: 2012-5-5 20:31
非常感谢啊。解答的很好。
作者: 攻城狮    时间: 2012-5-5 21:09
安路凤 发表于 2012-5-5 20:23
嘿嘿 我说的不对哦
谢谢斑竹还给我分呢
不过 不许叫我凤姐

嗯 加油学习 十期见
作者: 韩新凯    时间: 2012-5-6 12:56
本帖最后由 韩新凯 于 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-6 20:34
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);
        }





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