int i=2;
i+=i-=i*i;
System.out.print(i);i输出是多少,为什么,几个赋值号=连用的时候,例如:表达式=表达式=表达式.......,遵循什么规则?java里有没有静态构造函数,或者构造函数里面可不可以有静态变量和静态方法~求数组的长度为什么用length,而不是length()

解决方案 »

  1.   

    java里有没有静态构造函数,或者构造函数里面可不可以有静态变量和静态方法~没有静态构造函数,构造函数里可以有静态变量,可以调用静态方法求数组的长度为什么用length,而不是length()
    数组是一个类,它有一个属性叫length,没有length方法
      

  2.   

    i+=i-=i*i;这个首先要说一句:在同一个表达式里对同一个变量赋值超过1次,注定会悲剧它是这样执行的先执行i-=i*i得i=-2然后执行i=2-2红色的2是刚开始那个i,-2是后来的i总之,再说一遍:在同一个表达式里对同一个变量赋值超过1次,注定会悲剧,如i=i++
      

  3.   

    字节码如下,【】表示栈,左边表示栈底,右边表示栈顶 0:   iconst_2
     1:   istore_1
     2:   iload_1
     3:   iload_1
     4:   iload_1
     5:   iload_1
     6:   imul
     7:   isub
     8:   dup
     9:   istore_1
     10:  iadd
     11:  istore_1
     12:  getstatic       #3; //Field java/lang/System.out:Ljava/io/PrintStream;
     15:  iload_1
     16:  invokevirtual   #4; //Method java/io/PrintStream.print:(I)V
     19:  return 0:将2压栈:【2】
     1:将栈顶元素弹出,存储到局部变量索引为1的位置(也就是i):【】
     2:将局部变量索引为1的值入栈:【2】
     3:将局部变量索引为1的值入栈:【2,2】
     4:将局部变量索引为1的值入栈:【2,2,2】
     5:将局部变量索引为1的值入栈:【2,2,2,2】
     6:弹出栈顶两个元素,相乘,结果入栈:【2,2,4】
     7:弹出栈顶两个元素,相减,结果入栈:【2,-2】
     8:复制栈顶元素:【2,-2,-2】
     9:将栈顶元素弹出,存储到局部变量索引为1的位置(也就是i,此时i的值为-2):【2,-2】
     10:弹出栈顶两个元素,相加,结果入栈:【0】
     11:将栈顶元素弹出,存储到局部变量索引为1的位置(也就是i,此时i的值为0):【】
     12-16:打印相关
    从字节码可以看出,java是先将操作数一次性入栈的
      

  4.   

    通俗易懂一点的,
    int i =2;
    i+=i-=i*i;被分解成:
    int i = 2;
    i-=i*i;
    i=2+i;
      

  5.   


    这个i-=i*i 怎么就得到i=-2啦?
      

  6.   

    第一问答案为0,
    int i=2;<1>
    i+=i-=i*i;<2>
    System.out.print(i);<3>
    <2>式中,在+=,-=运算符中,具有最低的优先级,运算时也是从右往左,那么你要先做乘法,得到的是:i+=i-=4,继续,记住,此时的i的值还是2,没变,因为值的运算跟i的值没关系,接着i+=-2,看到了吗?中间的i现在变成了-2,但是也不会影响到第一个i,即是最左边的i,此时他的值仍为2,这么一来你就知道了撒,运算是2+=-2,为0.第二问,java里是没有静态构造函数,构造函数里面也不可以有静态变量和静态方法~。你得弄清楚static的含义,在java中,static修饰的东西都被类公用了。访问时跟类联系,与具体对象无关,但是构造方法是专门用来实例化对象的。这样就纠结了。没必要嘛,对吧。第三问,求数组的长度用length,是因为java为数组提供了一个叫做length的属性,作为计数变量来记录你装入数组的元素的个数,不是length(),你可能看着length()比较眼熟,在String,StringBuffer里面提供了这样一个方法,用来返回int型的字符串的长度。然后在数组中没有。你要弄懂带括号的在java中代表是方法,不带括号的在java中代表是字段。对于类来讲就是属性。。希望能帮到你。呵呵,期待共同进步。
      

  7.   

    i -= i*i
    i = i-i*i
    i = 2-4
    i = -2
      

  8.   

    回答一下第二个问题,
    严格说来java里面是有静态构造函数的,或者不能叫做静态构造函数,应该叫做类初始化方法,这个方法的方法名叫做<clinit>方法,这个方法是不被java源代码所接受的,他是在编译后由jdk编译器生成,并且由编译器自己调用的方法,换言之,他也不能被java语言来调用,这个类初始化方法顾名思义就是初始化类的方法,他的作用在于在类装载之后的初始化过程中,初始化类的静态成员变量和执行类的静态块(这些代码编译以后都在<clinit>方法内)。对于java程序员来说,它是一个不存在的方法,但是虚拟机运行java代码是需要它的。
      

  9.   

    改一下,那不是编译器调用,那个方法是由虚拟机自身调用,不被其他任何方法以任何形式调用(如果用jni可能可以调用到这个另类的方法)
      

  10.   

    回答第一个问题,在很多语言中,对于运算表达式都有这样一个规范。
    普通的表达式,如+、-、*、/等等数学表达式,还有比较的逻辑表达式,都是以从左至右的方式运算的,一些特殊的运算表达式,如赋值表达式= 或者位移表达式<< >> >>>都是从右至左运算的,而且这之前也要考虑运算的优先级,当然括号可以改变运算的优先级,总之,弄懂算术表达式的运算方式,这个问题是很显而易见的。
      

  11.   

    第一个问题真没必要,我实在搞不明白。这种东西可能只有java的设计者能够用到吧。
      

  12.   

    路过...貌似构造函数本身就是静态的..类似i+=i-=i*i;这样的代码,在C中是从右向左走的.可以参考下,建议不要这种难阅读的代码.....本人初学。。