根据 JLS,表达式可以出现的地方?

Places where an expression can occur as per the JLS?

考虑文章 §15.1 关于表达式可能出现的地方:

An expression occurs in either:

• The declaration of some (class or interface) type that is being declared: in a field initializer, in a static initializer, in an instance initializer, in a constructor declaration, in a method declaration, or in an annotation.

• An annotation on a package declaration or on a top level type declaration.

我不认为这是所有表达式出现位置的详尽列表 - 例如:

int a=23; //declaration of a local type
a=33; //this is re-initialization of the type

//or like a simple method invocation from inside a method like
foo();

上面的条款是否正确 - 或者只是 JLS 中的随意陈述?

该条款实际上是正确的,尽管没有以精确的方式说明。

例如:

  • a=33;

    中的a=33是表达式,后面跟着;也是表达式语句。只有在允许其他语句的情况下才允许使用表达式语句;即 within 方法或构造函数声明(在 body 中),或在实例或 static 初始化程序(块)中。

    请注意,在 JLS 中,方法的主体是方法声明的一部分。这就是为什么我们可以说语句 方法声明中。

  • foo();

    foo() 调用是一个表达式,当后面跟着一个 ; 时,它也是一个表达式语句;见上文。

理解“在”在此上下文中的含义是一个问题。它的意思是“在里面”而不是“直接在里面”。

当您认为位于 class 内的方法声明内的表达式语句是 ... 也 间接地 时,就会出现不精确性class.

您可能会争辩说该子句是描述性的而不是规范性的,因为它们没有准确说明“in”在这种情况下的含义。但即便如此,如果你按照上面的解释,描述是正确的。


您的int a=23;“示例”不是一个表达式,因此它与您要表达的观点不相符。它可以是一个语句,也可以是一个“在”class 或接口声明中的(包私有)字段声明。