Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaDOM/AST-为什么MethodInvocation是一个表达式?_Java_Dom_Abstract Syntax Tree_Eclipse Jdt - Fatal编程技术网

JavaDOM/AST-为什么MethodInvocation是一个表达式?

JavaDOM/AST-为什么MethodInvocation是一个表达式?,java,dom,abstract-syntax-tree,eclipse-jdt,Java,Dom,Abstract Syntax Tree,Eclipse Jdt,在JavaDOM/AST()中,为什么初始值设定项包含块,为什么方法调用是表达式而不是语句 我是说,根据密码 int a = Integer.parseInt("1"); ASTView插件只向我显示初始值设定项>方法调用 有没有一个初始值设定项真的有块元素 再者,如果我有这样的方法 public void thisMethod(){ System.out.println(); } MethodInvocation被包装到ExpressionStatement中。但是为什么Metho

在JavaDOM/AST()中,为什么初始值设定项包含块,为什么方法调用是表达式而不是语句

我是说,根据密码

int a = Integer.parseInt("1");
ASTView插件只向我显示初始值设定项>方法调用
有没有一个初始值设定项真的有块元素

再者,如果我有这样的方法

public void thisMethod(){
    System.out.println();
}
MethodInvocation被包装到ExpressionStatement中。但是为什么MethodInvocation不是一个语句呢?只是一个简单的系统。out.println()是一个有效的“语句”。JavaDOM/AST意义上的表达式缺乏代表自身的能力


也许我没有完全理解表达式和语句之间的分离。

AST树的设计是为了反映编程语言的语法规则

语法上,初始值设定项由一个块组成,该块前面有一个可选的
static
修饰符。因此,它是最自然的实现,拥有一个由
块和修饰符(继承自
BodyDeclaration
)组成的
初始值设定项
类。所以我不明白你为什么质疑它

初始值设定项示例:

class Foo {
  static {
    System.out.println("static initializer");
    System.out.println("class Foo now initialized");
  }

  {
    System.out.println("instance initializer");
    System.out.println("an instance of Foo has been created");
  }
}

表达式和语句是两种不同的语法结构。有些地方只允许使用表达式或语句。但也有类似方法调用的结构,它们是表达式语句,这意味着可以同时完成角色、表达式和语句。它们可以单独调用以产生副作用,但也可以在需要值的地方调用


但由于Java不允许多重继承,您无法创建一个AST类
ExpressionStatement
继承
Expression
语句
。因此,您需要一个类似于EclipseAST的解决方案,其中
ExpressionStatement
继承其中一个并包装另一个。决定继承哪一个和包装哪一个很容易:您可以创建一个
语句
实现(子类)它将删除它已包装的
表达式的结果,但不能创建
表达式
实现,该实现为通过接口不提供结果的
语句提供结果。这种实现的另一种选择是使用接口。

这个“RTFM”对我毫无帮助,对不起。而且,它没有回答第一个问题。你理解表达和陈述的概念吗?如果不是,就没有必要询问特定实现的推理。关于您的第一个问题,“为什么初始值设定项包含块”-我不明白,如果不是块,初始化器还应该包含什么?您的链接有助于清除?不,没有。表达式不能代表它自己,语句可以代表它自己。但是MethodInvocation可以代表它自己!“如果不是块”:单个表达式,但方法调用可以返回一个值,因此在允许表达式的地方允许该值。方法调用适合表达式和语句。这就是表达语句的要点,是的,链接解释了这一点。但是你要读的不仅仅是主播的几句话。谢谢你的回答,我现在明白为什么MI是一个表达式了。但是一个块看起来像{…}。你见过像int a={…}这样的初始化吗?对于阵列,有一个ArrayInitializer。Afaik没有包含多个语句的初始值设定项(这是块的函数:将多个语句分组)