java学习第三天
编译器的优化
对于byte、short、char三中数据类型来说,如果右侧的赋值数据没有超过范围,那么javac编译器将自动隐含的为我们补上(byte),(short),(char)
- 如果没有超过左侧的数据类型的数范围,那么编译器不上强转
- 如果超过了左侧的数据类型的数据范围,那么编译器直接报错
byte a = 30;//编译器自动在30加上(byte)
byte b = 128;//超过byte数据范围,直接报错
再给变量进行复制的时候,如果右侧的表达式当中全部是常量,没有任何变量,那么编译器javac会将直接将若干个常量表达式的结果计算。
short result = 5 = 8;//等于右边全是常量,没有任何变量参与运算,编译之后得到的。class文件中相当于直接就是short result = 13;右侧的常量结果数值没有超过左侧的范围,所以正确
这就是编译器的常量优化
但是注意,一旦表达式中有变量参与,那么就不进行有这种优化了
流程控制
顺序结构
按照从上到下循序执行语句
判断语句
if(){
}
执行流程图
执行流程说明
首先判断关系表达式看其结果是true还是false
如果是true就执行语句体
如果是false就不执行语句体
if(){
} else {
}
执行流程
执行流程图
执行流程说明
首先判断关系表达式看其结果是true还是false
如果是true就执行语句体1
如果是false就执行语句体2
if(){
} else if(){
}…
执行流程图
执行流程说明
首先判断关系表达式1看其结果是true还是false
如果是true就执行语句体1
如果是false就继续判断关系表达式2看其结果是true还是false
如果是true就执行语句体2
如果是false就继续判断关系表达式…看其结果是true还是false
…
如果没有任何关系表达式为true,就执行语句体n+1
Swich语句
swich(表达式){
case 常量值:
语句体1:
break;
case 常量值:
语句体2:
break;
…
default:
语句体n+1;
break;
}
执行流程说明
首先计算出表达式的值
其次,和case依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结束。
最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束掉。
执行流程图
注意事项
1、swich(表达式)中表达式的返回值必须是以下几种类型之一:
byte,short,char,int,枚举(jdk1.5),String字符串(jdk1.7)
2、case子句中的值必须是常量,且所有case子句中的值应是不同的;
3、default子句是可任选的,当没有匹配的case时,执行default;
4、break语句用来在执行完一个case分支后使程序跳出swich语句块;如果没有break程序会顺序执行到swich结尾;
if分支结构和switch分支结构区别
if和swich语句很想,如果判断的具体数值不多,而且复合byte、short、int、char这四种类型。建议使用swich语句,因为效率稍高;
其他情况:对区间进行判断,对结果为boolean类型进行判断,使用if,if的使用范围比较广泛。
循环语句
while循环
while(布尔表达式)({
语句体
}
只要布尔表达式为 true,循环就会一直执行下去。
do…while循环
do{
语句体
}while(布尔表达式);
- 对于 while 语句而言,如果不满足条件,则不能进入循环。但有时候我们需要即使不满足条件,也至少执行一次。
- do…while 循环和 while 循环相似,不同的是,do…while 循环至少会执行一次。
- 布尔表达式在循环体的后面,所以语句块在检测布尔表达式之前已经执行了。 如果布尔表达式的值为 true,则语句块一直执行,直到布尔表达式的值为 false。
for循环
for(初始化语句;布尔表达式;语句){
语句体
}
注意事项
- 最先执行初始化步骤。可以声明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句。
- 然后,检测布尔表达式的值。如果为 true,循环体被执行。如果为false,循环终止,开始执行循环体后面的语句。
- 执行一次循环后,更新循环控制变量。
- 再次检测布尔表达式。循环执行上面的过程。