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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© H._张_♂ 中级黑马   /  2014-4-15 19:44  /  2387 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么无法改变i的值?谁能深层次的帮我分析下!!
  1. public class StractTest {
  2.                
  3.         public static void main(String args[])
  4.         {
  5.                 int i = 4, j = 2;
  6.                 leftshift(i, j);
  7.                 System.out.println(i);
  8.         }

  9.         public static void leftshift(int i, int j)
  10.         {
  11.                    i=i+j;
  12.         }
  13. }
复制代码

13 个回复

倒序浏览
本帖最后由 nestor 于 2014-4-15 19:53 编辑


这样就可以了
  1. public class StractTest {      
  2.             public static void main(String args[])
  3.             {
  4.                     int i = 4,j = 2;
  5.                     i=leftshift(i, j);
  6.                     System.out.println(i);
  7.             }

  8.             public static int leftshift(int i, int j)
  9.             {
  10.                         i=i+j;
  11.                        return i;
  12.             }
  13.     }
复制代码


回复 使用道具 举报
本帖最后由 anqi 于 2014-4-15 19:53 编辑

应该是4,这个问题其实挺经典,我也犯过这种错误,
你函数中的i是个局部变量,它和成员变量i不是一个,指向的不是同一个内存空间,自然不能相互影响。你的函数和我的函数其实是一样的。
  •   public static void leftshift(int x, int y)
  •         {
  •                    x=x+y;
  •         }


回复 使用道具 举报
本帖最后由 月光海 于 2014-4-15 19:55 编辑

你改变的是leftshift方法中的i的值,你将调用的方法的void的改为int,就可以,然后在main中用i接收,main方法中的i和leftshift方法中的i指向的并不是同一内存空间,传过去的只是copy的值,这个你要看透毕老师讲的引用类型和值类型参数传递就明白了
  1.    public static void main(String args[])
  2.             {
  3.                   int i = 4, j = 2;
  4.                    i= leftshift(i, j);
  5.                     System.out.println(i);
  6.             }

  7.             public static int leftshift(int i, int j)
  8.             {
  9.                    return    i=i+j;
  10.             }
复制代码
回复 使用道具 举报
main()和leftshift()里面的I不是同一个,是2个局部变量,所以leftshift()里面改变了I,main()里面的I还是不变的!
回复 使用道具 举报
class StractTest {
               
        public static void main(String args[])
        {
                int i = 4, j = 2;
                System.out.println(leftshift(i, j));
        }

        public static int leftshift(int i, int j)
        {
                  return i=i+j;
        }
}
实测,这样可以解决问题。具体原因一个是楼主你的leftshift方法中没有返回值。另一个是函数返回的是一个值,需要声明一下变量i的值变成了这个返回的值。
即 System.out.println(leftshift(i, j)); 这一步也可以分开写成
i=leftshift(i, j);
System.out.println()i;
回复 使用道具 举报
形参跟实参的差别.
java中传参数只有值传递 ,对于基本类型,是传的具体的数值,而对于对象等引用类型,传递 的则是引用.所谓值传递,就是说传递的东西是实参的复制品,直接改变实参是做不到的.

点评

我觉得你说得很简单易懂  发表于 2014-4-15 20:50
回复 使用道具 举报 1 1
各个方法都会在栈中开辟一块空间,你改变的是leftshift方法中的i,而不是main方法中的i,具体你可以去看一下视频中的对象内存体现那一块,毕老师有详细讲解
回复 使用道具 举报
这是Java中基本数据类型参数传递 与 引用数据类型参数传递 的区别。
现在这时间点在YY: 85155393(传智)刚好在讲这个,或之后去下载相关的视频。
回复 使用道具 举报
多数的编程语言对于基本类型的参数传的都是值,也就是讲原变量的拷贝传入方法中,他并不会改变原变量的值,我学java是看的毕老师的视频,好像没有针对这个讲过,C里面就有讲,C里面有引用这个知识点。我看上面有人说方法没有返回值,其实有返回值也一样,他改变的不是原来的i,而是将i和j的复制品传入方法中,将运算的结果返回,又重新赋给了i,如果只从实现功能上说算是实现了,实质上和返回值并没有关系,i的改变不是在方法中,而是在main中被重新赋值改变的
回复 使用道具 举报
您的主函数中调用了函数但并没有赋值进去,而且下面的函数应该把void改成int,并把i=i+j改成return i+j。
回复 使用道具 举报
具体可以这么写:
public class Demo
{
        public static void main(String args[])
        {
                                leftshift(4,2);
                                leftshift(5,3);
        }
        public static void leftshift(int i, int j)
        {
                 System.out.println(i+j);
        }
}
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马