.method()没有参考

时间:2015-06-14 22:21:08

标签: java methods

我注意到我的程序中正确编译了以下代码:

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()也有效!这是为什么?

2 个答案:

答案 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为例。

因此,如果方法名称是一个简单的标识符(只是一个名称),它首先在您的类中查找,然后在超类中查找。如果没有找到,那么它会查找封闭的类。最后,它寻找静态导入。

通常您不需要所有这些信息,因为您不应该有三种或四种方法可供选择。这对维护者来说很难。但是你应该知道搜索顺序,因为有时会发生名称冲突,你应该至少知道有一个已定义的搜索顺序。要记住的重要规则是你的班级,然后是超级班级。另外两个非常直观。