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

© 乐凡 初级黑马   /  2012-8-13 22:00  /  1725 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

6 个回复

倒序浏览
  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: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: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. }
复制代码
回复 使用道具 举报
你看一下这个帖子估计就清楚了
http://bbs.itheima.com/thread-22268-1-1.html
回复 使用道具 举报
谢啦 兄弟
回复 使用道具 举报
杨彪 中级黑马 2012-8-13 22:26:13
7#
首先你得了解它在内存上是怎么走的,还有就是成员变量的作用域 ,
        成员变量:针对整个类都有效。
        局部变量:在某个范围内有效。(一般指的就是方法,语句体内)
首先在主方法中有两个成员变量 int i = 4, j = 2;    然后调用leftshift(i, j);方法是传递的地址值 而 leftshift()在另一块空间 虽然把 i ,j的值传了过去  但是在leftshift()中, 所以在主方法中打印 i, j 的值不变
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马