黑马程序员技术交流社区

标题: 求助 [打印本页]

作者: 乐凡    时间: 2012-8-13 22:00
标题: 求助
本帖最后由 乐凡 于 2012-8-13 22:01 编辑

package cn.itcast;


      
public class TestDemo      
{
        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 经过计算不是6了吗 怎么打印结果为4啊?不解啊
                System.out.println(j);
        }
}

作者: 周瑞    时间: 2012-8-13 22:12
  1. public class TestDemo      
  2. {
  3.         public static  void leftshift(int i, int j)
  4.         {
  5.                    i+=j;
  6.                   
  7.         }
  8.         public static void main(String args[])
  9.         {
  10.                 int i = 4, j = 2;
  11.                 leftshift(i, j); //这里你你调用了 leftshift(i, j)方法,你需要将i和j的值作为参数传递给此函数,而在java中基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的。所以你在 leftshift函数中执行的i+=j;并不会改变原有的i值,而i在这函数中的值为4,所以结果为4
  12.                 System.out.println(j);
  13.         }
  14. }
复制代码

作者: 王舜民    时间: 2012-8-13 22:14
本帖最后由 王舜民 于 2012-8-13 22:18 编辑

public class TestDemo      
{
        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 经过计算不是6了吗 怎么打印结果为4啊?不解啊  
                System.out.println(j); //打印的值是根据上面主函数 int i = 4, j = 2; 而定的
        }
}
System.out.println(j); 打印的是j  
永远是2不会改变。除非你打的是 i  结果才永远为4.
=

/这里你你调用了leftshift(i,j)方法,你需要将i和j的值作为参数传递给此函数,而在java中基本类型作为参数传递时,无论你在leftshift(i,j)方法怎么折腾,主函数i,j值是不会改变的。还有在Java中对象作为参数传递时,是把对象在内存中的地址拷贝了一份传给了参数。你可以百度下“形参和实参”加深理解

不信你可以改成这样就知道了
package cn.itcast;
public class TestDemo      
{
        public static  void leftshift(int i, int j)
        {
                   i=444;
                   j=222;
                  
        }
        public static void main(String args[])
        {
                int i = 4, j = 2;
                leftshift(i, j); //
                System.out.println(i); 还是 4
               System.out.println(j); 还是 2
        }
}

作者: 谭培龙    时间: 2012-8-13 22:15
本帖最后由 谭培龙 于 2012-8-13 22:19 编辑

因为这2个变量定义在main函数,这个是引用传递,并没有对变量进行重新赋值。所以j和i的值一直都在栈内存中没有改变。

修改了代码 这样就能算出是6
  1. class TestDemo
  2. {
  3. public static int leftshift(int i, int j)
  4. {
  5. return i+=j;

  6. }
  7. public static void main(String args[])
  8. {
  9. int i = 4, j = 2;
  10. int x =leftshift(i, j); //i 经过计算不是6了吗 怎么打印结果为4啊?不解啊//用一个变量记住这个值
  11. System.out.println(x);
  12. }
  13. }
复制代码

作者: 王舜民    时间: 2012-8-13 22:20
你看一下这个帖子估计就清楚了
http://bbs.itheima.com/thread-22268-1-1.html
作者: 乐凡    时间: 2012-8-13 22:22
谢啦 兄弟
作者: 杨彪    时间: 2012-8-13 22:26
首先你得了解它在内存上是怎么走的,还有就是成员变量的作用域 ,
        成员变量:针对整个类都有效。
        局部变量:在某个范围内有效。(一般指的就是方法,语句体内)
首先在主方法中有两个成员变量 int i = 4, j = 2;    然后调用leftshift(i, j);方法是传递的地址值 而 leftshift()在另一块空间 虽然把 i ,j的值传了过去  但是在leftshift()中, 所以在主方法中打印 i, j 的值不变




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