表达基础知识
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
- 简单标识符; 例如
- 初级包括:
- 文字; 例如
1,1.0,'X',hello,false和null - 类文字表达; 例如
MyClass.class this和<TypeName> . this- 括号表达式; 例如
( a + b ) - 类实例创建表达式; 例如
new MyClass(1, 2, 3) - 数组实例创建表达式; 例如
new int[3] - 字段访问表达式; 例如
obj.someField或this.someField - 数组访问表达式; 例如
vector[21] - 方法调用; 例如
obj.doIt(1, 2, 3) - 方法参考(Java 8 及更高版本); 例如
MyClass::doIt
- 文字; 例如
- 一元运算符表达式; 例如
!a或i++ - 二元运算符表达式; 例如
a + b或obj == 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)。 - 类实例创建表达式。