表達基礎知識

Java 中的表示式是進行計算的主要構造。這裡有些例子:

1                 // A simple literal is an expression
1 + 2             // A simple expression that adds two numbers
(i + j) / k       // An expression with multiple operations
(flag) ? c : d    // An expression using the "conditional" operator
(String) s        // A type-cast is an expression
obj.test()        // A method call is an expression
new Object()      // Creation of an object is an expression
new int[]         // Creation of an object is an expression

通常,表示式由以下形式組成:

  • 表示式名稱包括:
    • 簡單識別符號; 例如 someIdentifier
    • 合格的識別符號; 例如 MyClass.someField
  • 初級包括:
    • 文字; 例如 11.0'X'hellofalsenull
    • 類文字表達; 例如 MyClass.class
    • this<TypeName> . this
    • 括號表示式; 例如 ( a + b )
    • 類例項建立表示式; 例如 new MyClass(1, 2, 3)
    • 陣列例項建立表示式; 例如 new int[3]
    • 欄位訪問表示式; 例如 obj.someFieldthis.someField
    • 陣列訪問表示式; 例如 vector[21]
    • 方法呼叫; 例如 obj.doIt(1, 2, 3)
    • 方法參考(Java 8 及更高版本); 例如 MyClass::doIt
  • 一元運算子表示式; 例如 !ai++
  • 二元運算子表示式; 例如 a + bobj == null
  • 三元運算子表示式; 例如 (obj == null) ? 1 : obj.getCount()
  • Lambda 表示式(Java 8 及更高版本); 例如 obj -> obj.getCount()

不同形式的表達的細節可以在其他主題中找到。

  • 運算子主題包括一元,二元和三元操作符表示式。
  • Lambda 表示式主題包括 lambda 表示式和方法引用表示式。
  • 類和物件” 主題涵蓋類例項建立表示式。
  • 陣列主題包括陣列訪問表示式和陣列例項建立表示式。
  • 字面的話題涵蓋了不同型別的文字表述。

表示式的型別

在大多數情況下,表示式具有靜態型別,可以通過檢查及其子表示式在編譯時確定。這些被稱為獨立表示式。

但是,(在 Java 8 及更高版本中)以下型別的表示式可能是多重表示式

  • 帶括號的表示式
  • 類例項建立表示式
  • 方法呼叫表示式
  • 方法引用表示式
  • 條件表示式
  • Lambda 表示式

當表示式是 poly 表示式時,其型別可能受表示式的目標型別的影響 ; 即它用於什麼。

表示式的值

表示式的值與其型別相容。例外情況是堆汙染發生時; 例如,因為不安全轉換警告已被(不適當地)抑制或忽略。

表達陳述

與許多其他語言不同,Java 通常不允許將表示式用作語句。例如:

public void compute(int i, int j) {
    i + j;   // ERROR
}

由於評估表示式的結果不能使用,並且由於它不能以任何其他方式影響程式的執行,因此 Java 設計者採取的態度是這種使用是錯誤的,或者是錯誤的。

但是,這不適用於所有表示式。表示式的子集(實際上)是合法的語句。該套裝包括:

  • 賦值表示式,包括操作和成為賦值。
  • 前後增量和減量表示式。
  • 方法呼叫(void 或非 void)。
  • 類例項建立表示式。