OCA/OCP Java Note (5): Operators and Statements
Contents
1. Working with Binary Arithmetic Operators
1.1. Arithmetic Operators
Java中的求模运算可以作用于负数和浮点,对于给定的除数y和为负的被除数,求模的结果位于(-y + 1)和0之间。
1.2. Numeric Promotion
数值类型自动转换(提升)规则:
- 如果两个值具有不同的数据类型,Java将自动把其中一个值的数据类型转换(提升)为较大的那个数据类型。
- 如果一个值是整型,另一个值是浮点,Java将自动把整型提升浮点值的数据类型。
- 较小的数据类型,即byte、short、char,在用于二元运算符时,即便参与运算的两个值都不是int,这些较小的数据类型都会首先会被提升为int。
- 在所有的提升和运算完成之后,运算结果的数据类型与提升后的数据类型相同。
eg. What is the data type of x + y?
double x = 39.21; float y = 2.1;
答案:无法编译,浮点字面值默认为double,将float y = 2.1改为float y = 2.1f,结果为double。
2. Working with Unary Operators
2.1. Increment and Decrement Operators
eg.
int x = 3; int y = ++x * 5 / x-- + --x; System.out.println("x is " + x); System.out.println("y is " + y);
运算顺序:
int y = 4 * 5 / x-- + --x; // x assigned value of 4 int y = 4 * 5 / 4 + --x; // x assigned value of 3 int y = 4 * 5 / 4 + 2; // x assigned value of 2
输出:
x is 2 y is 7
3. Using Additional Binary Operators
3.1. Assignment Operators
Java会自动将较小的类型提升为较大的类型,但如果尝试将较大的类型转换为较小的类型,将给出编译错误。
eg.
int x = 1.0; // DOES NOT COMPILE short y = 1921222; // DOES NOT COMPILE int z = 9f; // DOES NOT COMPILE long t = 192301398193810323; // DOES NOT COMPILE short x = 10; short y = 3; short z = x * y; // DOES NOT COMPILE
3.2. Equality Operators
相等运算符用于以下三种情况:
- 比较两个数值基本类型。如果两个数值的数据类型不同,将按照如前所述的规则进行提升,例如5 == 5.00会返回true,因为左边的5会自动提升为double。
- 比较两个boolean值。
- 比较两个对象,包括null和String
eg.
boolean x = true == 3; // DOES NOT COMPILE boolean y = false != "Giraffe"; // DOES NOT COMPILE boolean z = 3 == "Kangaroo"; // DOES NOT COMPILE
4. Understanding Java Statements
4.1. The if-then-else Statement
if后要使用boolean表达式,否则会出现编译错误。
eg.
int x = 1; if(x) { // DOES NOT COMPILE ... } if(x = 5) { // DOES NOT COMPILE ... }
4.2. Ternary Operator
三元运算符中的第二个和第三个表达式不一定要具有相同的类型,但需要注意和赋值运算符一同使用的情况。
eg.
System.out.println((y > 5) ? 21 : "Zebra"); int animal = (y < 91) ? 9 : "Horse"; // DOES NOT COMPILE
在Java 7中,运行时只会计算三元运算符中符合条件的一个右值表达式,另一个表达式相当于被短路。
eg.
int y = 1; int z = 1; final int x = y<10 ? y++ : z++; System.out.println(y+","+z); // 2,1 int y = 1; int z = 1; final int x = y>=10 ? y++ : z++; System.out.println(y+","+z); // 1,2
4.3. The switch Statement
switch支持的类型包括:
- int and Integer
- byte and Byte
- short and Short
- char and Character
- int and Integer
- String
- enum values
注意:switch不支持boolean和long,及其对应的包装类。case语句后的值必须是编译时常量,可使用字面值、枚举常量和final常量,且和用于switch的值具有相同类型。