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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

public class Inc  
{
      public static void main(String args[])
      {
          Inc inc = new Inc();
          int i = 0;
          inc.fermin(i);
          i=i++;
          System.out.println(i);
      }
      void fermin(int i)
      {
          i++;
      }
}

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

10 个回复

倒序浏览
你的方法对传进去的参数的改变不会影响你的实际参数,因为这是一个值引用,所以方法结束后i的值依旧是0,最后那一句i=i++;因为自增在后面所以先把i当前的值作为表达式的值给等号左边的变量,然后i再加1,所以输出的时候i的值是0
回复 使用道具 举报
这里的void fermin(int i)
      {
          i++;
      }
由于传的是int类型,是基本类型,所以i的值在外部并不改变;也就是 inc.fermin(i); 之后i在外部还是0;
关于i=i++;这也是老问题了;与c,c++不一样
i还是0;如果不懂可以再本站搜一下,呵呵,你会有很多收获的;
参见http://search.itheima.com/f/discuz?mod=forum&formhash=0688ccca&srchtype=title&srhfid=54&srhlocality=forum%3A%3Aforumdisplay&sId=7548030&ts=1338699512&cuId=21361&cuName=%E6%A2%81%E5%B0%8F%E6%B3%A2&gId=11&agId=0&egIds=&fmSign=&ugSign11=&sign=b2d8fab97b9985bd4ee4864b1f4658bb&charset=utf-8&source=discuz&fId=0&q=i%3Di%2B%2B&srchtxt=i%3Di%2B%2B&searchsubmit=true

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

回复 使用道具 举报
楼上说的对;  
回复 使用道具 举报
本帖最后由 黑马-唐磊 于 2012-6-3 13:25 编辑

外部值不会影响实际传递的参数值
回复 使用道具 举报

本帖最后由 胡团乐 于 2012-6-3 13:28 编辑

          int i = 0;
          inc.fermin(i);
          i=i++;  //这儿 i 还是等于0的 如果i++ 就是1 了; 只是把 i 的值付给了i,并不是把i++的值赋给它;
          System.out.println(i); //同理 这儿输出 前面的 i 而不是i++后的值输出i后才进行i++的操作;
      }
      void fermin(int i)
      { i++; }

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

回复 使用道具 举报
问题原因:这个问题蛮典型哈~
void fermin(int i)方法中,你传入了主函数中的成员变量i,然后是在fermin()方法内部再进行的处理~
这个处理没有影响到你主函数中的i值。

解决方法:
1,你把fermin()内的参数换一下,看起来或许好点:
   void fermin(int j) { j++; }
2,可以改变下fermin()方法的实现:
   public int fermin(int i) { return ++i;}

这样应该可以了额~
回复 使用道具 举报
public class Inc  
{
      public static void main(String args[])
      {
          Inc inc = new Inc();
          int i = 0;
          inc.fermin(i); //
          i=i++;         //换成++i  就会的到2
          System.out.println(i); //因为是i++所以返回的是1并不是加完之后得的2
      }
      void fermin(int i) //你这个方法没有返回值 而且 这个i 并不是主函数中的 i 注意局部变量
      {
          i++;
      }
}
更改之后的代码

public class Inc  
{
      public static void main(String args[])
      {
          Inc inc = new Inc();
          int i = 0;
          i = inc.fermin(i);
          i=++i;
          System.out.println(i);
      }
      int fermin(int j)
      {
             ++j;
         return j ;
      }
}

这样结构就是2了

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

回复 使用道具 举报
class Inc  
{
      public static void main(String args[])
      {
          Inc inc = new Inc();
          int i = 0;
          inc.fermin(i);
          i=i++;
          System.out.println(i);
      }
      void fermin(int i)
      {
          i++;
      }
}
当程序走到 inc.fermin(i); 时,会调用fermin方法,把i的做为参数传入。并没有返回。
i=i++;  此时右边的 i 在没有自增之前将值赋给了左边的 i  ,之后再自增。所以i仍然还是等于0.

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

回复 使用道具 举报
1,这里的void fermin(int i)方法是Inc类的成员方法

2,它是Inc inc 对象所具备的行为方法,可以对成员变量进行操作.

3,void fermin(int i)中的 i 是局部变量,它的生命周期只局限于这个函数开始的结束

4,执行inc.fermin(i)时;调用了void fermin(int i)方法,相当于把当前 i 的值赋给了 fermin函数中的参数,也就是
int i=i(为了区分,下面写成i1,i2即 i1=i2), 执行方法体的时候,i1++ 此时,i1的值为1
但是当该函数执行完后,i1自动销毁.   其实这个函数并没有对i2做任何的赋值操作
  
5,如果想对 i 进行操作的话,应该让它的生命周期更长,定义成成员变量

6,i=i++;这里是对局部变量 i 的赋值,i++操作符含义是执行完表达式再进行赋值
  相当于System.out.println(i++);


回复 使用道具 举报
舒远 黑马帝 2012-6-4 15:30:02
11#
fermin方法传递的只是一个值,内存中是一个拷贝,该方法内部对该拷贝的值的任何改变不影响原变量的值。
如果方法传递的参数是一个引用类型,结果就不一样了,改变的就是该引用指向的真实对象。对对象的任何操作都将影响原变量。因为该变量仍然指向被改变的对象!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马