我注意到我的程序中正确编译了以下代码:
ArrayList<Token> eval = new ArrayList<>(0);
for (Token token : tokens) {
eval.add(token);
if (token.equals(new Token("EOS", "EOS"))) {
.clear();
} else {
continue;
}
}
但是,.clear()
部分让我感到困惑。我应该做instance.method()
,但.method()
也有效!这是为什么?
答案 0 :(得分:1)
您问题中的代码段在语法上是不正确的。以下语法适用于method invocation expressions
方法调用
- MethodName ( [ArgumentList] ) - TypeName . [TypeArguments] Identifier ( [ArgumentList] ) - ExpressionName . [TypeArguments] Identifier ( [ArgumentList] ) - Primary . [TypeArguments] Identifier ( [ArgumentList] ) - super . [TypeArguments] Identifier ( [ArgumentList] ) - TypeName . super . [TypeArguments] Identifier ( [ArgumentList] )
换句话说,您可以使用不合格的方法的标识符(名称),其中上下文将确定哪个方法是什么以及它的目标引用是什么(如果有的话)。否则,您将需要一个表达式或类型名称,该名称在方法标识符前面加上.
个字符。同样,有一组规则确定在编译时和运行时调用的方法。
这部分代码
.clear();
不符合上面定义的语法。如果在字面上使用它,在Java中语法上是不正确的。
您可能正在查看伪代码或语言的简略形式(例如,在IDE中)。
答案 1 :(得分:0)
以下是JLS的引用
15.12.1。编译时步骤1:确定要搜索的类或接口
在编译时处理方法调用的第一步是 弄清楚要调用的方法的名称以及哪个类或 用于检查该名称方法定义的接口。有 几个案例要考虑,取决于之前的形式 左括号,如下。
如果表单是 MethodName ,则有三个子句:
如果它是一个简单的名称,即只是一个标识符,那么它的名称 方法是标识符。
如果标识符出现在可见方法的范围内 声明具有该名称(§6.3,§6.4.1),然后:
如果存在该方法为a的封闭类型声明 成员,让T成为最里面的类型声明。班级或 搜索界面是T。
此搜索政策称为“梳理规则”。它有效地寻找 在查找之前,嵌套类的超类层次结构中的方法 封闭类及其超类层次结构中的方法。看到 §6.5.7.1为例。
因此,如果方法名称是一个简单的标识符(只是一个名称),它首先在您的类中查找,然后在超类中查找。如果没有找到,那么它会查找封闭的类。最后,它寻找静态导入。
通常您不需要所有这些信息,因为您不应该有三种或四种方法可供选择。这对维护者来说很难。但是你应该知道搜索顺序,因为有时会发生名称冲突,你应该至少知道有一个已定义的搜索顺序。要记住的重要规则是你的班级,然后是超级班级。另外两个非常直观。