自动转化
因为浮点数的特殊性,long类型的变量可以自动转型为float类型的,这是由于float所能表示的值的范围大于long类型的。
例题1
byte b1=10;
byte b2=20;
byte b3=b1+b2; //有问题吗?
答案是有,因为两个byte类型相加,java虚拟机会默认他的结果是int类型,所以会编译出错。
例题2
int d = 5;
d = d++;
输出结果为5。
d++这样的语法是先将d++看作一个整体,其值是d原始的值,然后先进行d++,再进行赋值。有一瞬间d的值是6,但是随后被d++整体的值(5)赋值为5。而++d则不同。
例题3
二进制与十进制的转换:
所以结果是10100
十进制小数部份用二进制表示的方法:
一直X2,只要没有进一就添1,没有则补0
所以结果是0.001
选择语句
switch
当switch(x)x一定要与case中的类型相匹配。否则会出现类型不匹配(imcompatibal types)问题。
default可以放在case的前面,不影响判断。
例题1
下面语句运行结果为:()
switch (5) {
case 0:
System.out.print(0);
default: //default的位置并不影响switch的判断
System.out.print(5);
case 1:
System.out.print(1);
break;
case 2:
System.out.print(2);
break;
}
A) 1 B) 5 C) 0 D) 51
答案是D,因为没有找到匹配项,所以程序走向default,完成default之后向后继续走(即是说default并不跳出选择分支,只有break才是跳出选择分支的),进入case 0的语句之后同理,碰到break之后完成该选择语句。
switch()里面必须是int和enum–即枚举类型,(short,char,byte)都会自动转化成int。但是long不可以自动转化成int,因为会丢失精度,所以switch()里面也就不可以是long。java把string也’转化’成int了,用string的hash值(int型,hashCode()的返回值)代替string进行switch,然后再对string做一遍equals()判断。把你的程序编译成字节码再反编译回来,看看有什么不一样就行了
循环语句
带标签的continue和break语句
public class Test18 {
public static void main(String args[]) {
outer: for (int i = 101; i < 150; i++) {
for (int j = 2; j < i / 2; j++) {
if (i % j == 0){
continue outer;
}
}
System.out.print(i + " ");
}
}
}
如果不使用标签,那么continue会继续进行内部的for循环。使用标签就是为了让循环从内部循环跳到外部循环。