int i=2;
i+=i-=i*i;
System.out.print(i);i输出是多少,为什么,几个赋值号=连用的时候,例如:表达式=表达式=表达式.......,遵循什么规则?java里有没有静态构造函数,或者构造函数里面可不可以有静态变量和静态方法~求数组的长度为什么用length,而不是length()
i+=i-=i*i;
System.out.print(i);i输出是多少,为什么,几个赋值号=连用的时候,例如:表达式=表达式=表达式.......,遵循什么规则?java里有没有静态构造函数,或者构造函数里面可不可以有静态变量和静态方法~求数组的长度为什么用length,而不是length()
解决方案 »
- Java包和文件名的关系
- Math.ROUND的疑问
- 什么时候加void?public void Info(){}和double info(){}一个加了void一个冒?为什么?不都是打印出东西?
- 如何判断java运行时有多少个jframe??
- 子类可以赋给父类,父类可以赋给子类吗???
- 请高手推荐几个好点的Java网站。以及一个小问题~
- 有没有办法把DatainputStream中的所有数据一下读出来,也不是用readline一行一行的读?
- 谁能告诉我如何使用JAR进行压缩(语法)
- 下面的代码用eclipse compile为什么不行,我是完全从一个视频里抄过来的,视频里用的是ultra editor写的。是不是我一定要把class分开
- 求助 为什么会出现这样的情况???
- 关于think in java 中吸血鬼数的完整程序
- 异常处理的执行顺序的困惑
数组是一个类,它有一个属性叫length,没有length方法
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是先将操作数一次性入栈的
int i =2;
i+=i-=i*i;被分解成:
int i = 2;
i-=i*i;
i=2+i;
这个i-=i*i 怎么就得到i=-2啦?
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中代表是字段。对于类来讲就是属性。。希望能帮到你。呵呵,期待共同进步。
i = i-i*i
i = 2-4
i = -2
严格说来java里面是有静态构造函数的,或者不能叫做静态构造函数,应该叫做类初始化方法,这个方法的方法名叫做<clinit>方法,这个方法是不被java源代码所接受的,他是在编译后由jdk编译器生成,并且由编译器自己调用的方法,换言之,他也不能被java语言来调用,这个类初始化方法顾名思义就是初始化类的方法,他的作用在于在类装载之后的初始化过程中,初始化类的静态成员变量和执行类的静态块(这些代码编译以后都在<clinit>方法内)。对于java程序员来说,它是一个不存在的方法,但是虚拟机运行java代码是需要它的。
普通的表达式,如+、-、*、/等等数学表达式,还有比较的逻辑表达式,都是以从左至右的方式运算的,一些特殊的运算表达式,如赋值表达式= 或者位移表达式<< >> >>>都是从右至左运算的,而且这之前也要考虑运算的优先级,当然括号可以改变运算的优先级,总之,弄懂算术表达式的运算方式,这个问题是很显而易见的。