int i = 0;             //1
double j = 3.5;        //2
i += j;                //3
i = i + j;             //4第四行代码报错了,大家解释一下原因。

解决方案 »

  1.   

    double->int要强转的
    +=自动转了
      

  2.   

    第四行在做加运算时,右边的结果是double型的,把这个值赋给一个int型的变量会出错。
    至于为啥自增运算没有做此种转换,我不清楚了
    找找资料看看。
      

  3.   

    这个问题我也遇到过
    int i = 0;             //1
    double j = 3.5;        //2
    i += j;                //3
    i = i + j;             //4
    第3行可以运行,第4行报错,我知道第4应该强转
    第3行不知道是什么,但绝对不是自增相当于i = i + j; 也就是第4个表达式
    不知道两种写法有什么区别,请高手解答
      

  4.   

    第三行 隐式强制转换成了INT 那么输出结果应该是3
    第四行 没有强制转换,所以会报类型不匹配的错误
      

  5.   

    以前真的没注意到这种情况
    在例子里面
    i+=j其实相当于
    Double d=new Double(i+j);
    i=d.intValue();
      

  6.   

    这个例子必须要充分的 了解 计算机的 运算过程,解释如下:
    int i = 0;             //1
    double j = 3.5;        //2
    i += j;                //3   i 等于 i 加上 j
    i = i + j;             //4   i 加上 j 等于 i 如果你还不明白 往下看:计算机的运算 :  
    第 3 句  明确 指出 int 型 i 等于 i 加 j ,当相加时 因为以知结果是 int型 ,所以 程序自动转换!
    第 4 句  程序先 运行 int型 i 加 j,没有给出转换标志,读到这里已经出错,没有向下走!试着用你的脑子运行!
      

  7.   

    计算机的运算 :  
    第 3 句  明确 指出 int 型 i 等于 i 加 j ,当相加时 因为以知结果是 int型 ,所以 程序自动转换!
    第 4 句  程序先 运行 int型 i 加 j,没有给出转换标志,读到这里已经出错,没有向下走!试着用你的脑子运行!-------------------------------------------
    不解,,不理解,,,,
      

  8.   

    去掉第4行,使用 javap 得到的字节码:0:   iconst_0
    1:  istore_1
    2:  ldc2_w  #2; //double 3.5d
    5:  dstore_2
    6:  iload_1
    7:  i2d
    8:  dload_2
    9:  dadd
    10: d2i
    11: istore_1
    12: getstatic       #4;
    15: iload_1
    16: invokevirtual   #5;
    19: return从字节码中可以看出,i += j 的运算方法:先载入i(第6行),再将i转成double类型,再载入j,进行double的加运算,最终将结果再转化为 int 型(第10行)。JVM 这样做具体的理由嘛,估计跟 lirunjie1124 的解释类似吧。
      

  9.   

    to : bao110908(bao)(bao)
    不错!
      

  10.   

    不是强制转换的问题罢了...
    i+=j 是把j转换为int形,结果i还是int形.j还是double 形

    i=i+j 看等式右边就知道这个表达式的结果是一个duoble形,
    怎么能让double形的数,赋值于int形呢,这样明显是错误的..
      

  11.   

    在Java文档中有说明
    E1 op= E2 等价于 E1=(T)((E1)op(E2))
    也即bao110908(bao)(bao)要解释的过程。
      

  12.   

    第4行代码编译都不会通过的:
     i += j; java编译器认为 i 与 j 做 “+=” 操作,运行时做了强制转换。
    而 i = i + j 则编译器认为你将一个double的值付给int型变量,出错。
      

  13.   

    ZW_Ren(任再旺)E1 op= E2 等价于 E1=(T)((E1)op(E2))
    (t)指什么
      

  14.   

    to 楼上  E1=(T)((E1)op(E2))
    这里的T是指E1的类型。
      

  15.   

    了解java虚拟机才是 王道.
      

  16.   

    首先,编译器是不会通过i = i + j;这一句的。
    其次 i +=j;是在运算过程中强行转换;将i转换成double,这时i是double的,结果是3.5。最后会自动将i的类型还原,就变成3了。类似一下语句:
    double k = (double)i + j;
    i =  (int)k;
      

  17.   

    java虚拟机是 java语言的核心所在,那也不是我们这些搞java可以短时间瞭望的,不过大概了解它的思想,结构,还是好的!