表达基础知识

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)。
  • 类实例创建表达式。