对于容易引起误解的算术表达式,可以通过加括号的方式使其易懂
对于Java的参数传递方式,我的理解倾向于:对于基本类型而言,Java是传值;但对于对象,则是传引用
短路:
逻辑与 A&&B if A=false,则不再计算B
逻辑或 A||B if A=true,则不再计算B
逻辑与 A&&B if A=false,则不再计算B
逻辑或 A||B if A=true,则不再计算B
int和Integer的区别
int类型存储在堆栈中,存取速度快
Integer存储在堆中,存取速度相对慢一些
Integer是int类型的包装类型,基本类型都提供了对应的包装类型,用于进行面向对象的设计
左移位操作符(<<)能将操作符左边的操作数向左移动从操作符右侧指定的位数。
“有符号”右移位操作符将操作符左边的操作数向右移动从操作符右侧指定的位数,并且使用“符号扩展”,正0负1
“无符号”右移位操作符将操作符左边的操作数向右移动从操作符右侧指定的位数,并且使用“零扩展”
使用操作符常犯的错误:
==和=不分
按位与&和按位或| 代替 逻辑与&&和逻辑或||
Java中的类型转换:
扩展转换——不必显式进行类型转换
窄化转换——强制进行类型转换,可能会丢失信息,如double > int
若对基本数据类型执行算术运行或按位运算,只要比int小(char、byte、short),则在运算之前,这些值会自动转换成int。通常,表达式中出现的最大的数据类型决定了表达式最终结果的数据类型。
类型的“大小”为: char<byte<short<int<long<float<double
在进行流程控制时,Java不允许将一个数字作为布尔值使用,这与c++不同。
While和do-while唯一的区别就是do-while中的语句至少会执行一次,即使表达式第一次就被计算为false
Break用于强行退出循环,不执行循环中剩余的语句,通常,只有在不知道中断条件何时满足时,才需要使用break。continue则停止执行当前的迭代,然后退回循环的起始处,开始下一次迭代。
在Java中,标签起作用的唯一的地方刚好是在迭代语句之前(标签和迭代之间不要插入任何语句)。Break和continue通常只中断当前循环,但若随同标签一起使用,就会中断循环。下面的程序很好的说明了标签了使用:
public class LabeledFor {
//static Test monitor = new Test();
public static void main(String[] args) {
int i = 0;
outer: // Can't have statements here
for(; true ;) { // infinite loop
inner: // Can't have statements here
for(; i < 10; i++) {
System.out.println("i = " + i);
if(i == 2) {
System.out.println("continue");
continue;
}
if(i == 3) {
System.out.println("break");
i++; // Otherwise i never
// gets incremented.
break;
}
if(i == 7) {
System.out.println("continue outer");
i++; // Otherwise i never
// gets incremented.
continue outer;
}
if(i == 8) {
System.out.println("break outer");
break outer;
}
for(int k = 0; k < 5; k++) {
if(k == 3) {
System.out.println("continue inner");
continue inner;
}
}
}
}
// Can't break or continue to labels here
}
}
(需要注意的是,for循环在每次循环结束时,才会执行一次步进)
运行结果是i = 0
continue inner
i = 1
continue inner
i = 2
continue
i = 3
break
i = 4
continue inner
i = 5
continue inner
i = 6
continue inner
i = 7
continue outer
i = 8
break outer
Press any key to continue...
可以总结为如下:
label1:
outer-iteration{
inner-iteration{
//…………
break; //1
//…………
continue; //2
//…………
continue label1; //3
//…………
break label1; //4
}}
状况1处,break中断内部迭代,回到外部迭代;2处,continue使执行点移回内部迭代的起始处。3处,同时中断内部迭代和外部迭代,直接转到label1处,随后继续迭代过程,但却从外部迭代开始。4处,中断所以迭代,返回label1处,但不再重新进入迭代,实际上是完全中断了两个迭代。
Break和continue的规则同样的适用于while。
Switch的case语句中,使用单引号引起的字符也会产生用于比较的整数值。如:
Switch(c){
Case ‘a’ :
Case ‘e’ :
Case ‘u’ : System.out.println(“vowel”); break;
将一个float或double值转型成整数值后,总是将小数部分“砍掉”,而不是四舍五入。