OCA/OCP Java Note (5): Operators and Statements

1. Working with Binary Arithmetic Operators

1.1. Arithmetic Operators

  Java中的求模运算可以作用于负数和浮点,对于给定的除数y和为负的被除数,求模的结果位于(-y + 1)和0之间。

1.2. Numeric Promotion

  数值类型自动转换(提升)规则:

  1. 如果两个值具有不同的数据类型,Java将自动把其中一个值的数据类型转换(提升)为较大的那个数据类型。
  2. 如果一个值是整型,另一个值是浮点,Java将自动把整型提升浮点值的数据类型。
  3. 较小的数据类型,即byte、short、char,在用于二元运算符时,即便参与运算的两个值都不是int,这些较小的数据类型都会首先会被提升为int。
  4. 在所有的提升和运算完成之后,运算结果的数据类型与提升后的数据类型相同。

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

  相等运算符用于以下三种情况:

  1. 比较两个数值基本类型。如果两个数值的数据类型不同,将按照如前所述的规则进行提升,例如5 == 5.00会返回true,因为左边的5会自动提升为double。
  2. 比较两个boolean值。
  3. 比较两个对象,包括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的值具有相同类型。