当前位置: 首页 > 知识库问答 >
问题:

Java DOM/AST - 为什么方法调用是一个表达式?

鱼意远
2023-03-14

在 Java DOM/AST(http://help.eclipse.org/indigo/topic/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/dom/package-tree.html)中,为什么初始值设定项包含块,为什么方法调用是表达式而不是语句?

我的意思是,鉴于代码

int a = Integer.parseInt("1");

ASTView插件只显示初始化器

此外,如果我有这样的方法

public void thisMethod(){
    System.out.println();
}

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

也许我只是没有完全理解表达和陈述之间的区别。

共有1个答案

唐修明
2023-03-14

AST树旨在反映编程语言的语法规则。

从语法上来说,一个初始化程序由一个块组成,在它前面有一个可选的静态修饰符。所以它是最自然的实现,它有一个初始化程序类,由Block和修饰符(继承自Body宣言)组成。所以我不明白你为什么要质疑它。

初始化程序示例:

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类。所以你需要一个像在Eclipse AST中一样的解决方案,其中表达式从一个继承并包装另一个。决定继承哪个和包装哪个很容易:你可以创建一个语句实现(子类),它会删除它包装的表达式的结果,但是你不能创建一个表达式实现,它会为通过其接口不提供结果的语句提供结果。这种实现的替代方法是使用接口。

 类似资料:
  • 当我跑的时候 我在Java中得到错误。为什么?这相当于false==false,这是真的。这不是Java特有的,我在其他语言中也得到了相同的结果。这是因为短路评估吗?似乎左右双方仍会/应该进行比较。

  • 本文向大家介绍在一个静态方法内调用一个非静态成员为什么是非法的?相关面试题,主要包含被问及在一个静态方法内调用一个非静态成员为什么是非法的?时的应答技巧和注意事项,需要的朋友参考一下 由于静态方法可以不通过对象进行调用,因此在静态方法里,不能调用其他非静态变量,也不可以访问非静态变量成员。

  • graphql中的AST是什么?我用的是graphql-js。它有什么帮助吗? 任何文档中似乎都没有解释 AST 是什么

  • oracle java教程指出:(我强调) 表达式是由变量、运算符和方法调用组成的构造,它们根据语言的语法构造,并计算为单个值。 给定一个函数 方法调用表达式< code>doNothing()的值是什么? 我想知道这一点,因为在我的理解表明这个函数不返回任何东西。

  • 它给出的输出为“cricket”。但我不明白为什么?http://ideone.com/fteahg

  • 我有以下Thread子类(为了易读性稍微简化): 当我连接到服务器时,这个线程的一个实例是由我的客户端(使用Swing GUI)创建的。我觉得奇怪的是,我可以从主GUI调用方法,而且它是有效的。为什么无限而循环和/或调用不会阻止我这样做?我的意思是线程不应该一直忙于做其他事情吗?这是做事的好方法吗?如果不是,为什么不呢? 编辑 为了澄清我的困惑:如果这是在主线程中,它将在中的直到读取了某个内容,然