对于Java中变量之后的符号$是什么?

时间:2016-04-25 11:39:48

标签: java arraylist iterator

我正在审查我在互联网上发现的一个程序,而我正在试图弄清楚它是如何工作的,但我无法找到有关此功能的任何内容,这对我有帮助。

 public static double regress(double x, ArrayList<Double> terms) {
    double a = 0.0;
    int exp = 0;
    Iterator<Double> i$ = terms.iterator();
    while (i$.hasNext()) {
        double term = i$.next();
        a += term * Math.pow(x, exp);
        ++exp;
    }
    return a;
}

我知道该方法是在ArrayList中迭代来计算a值,但是这行Iterator<Double> i$ = terms.iterator();是什么意思?更具体地说,变量$之后使用的符号i是什么?

5 个答案:

答案 0 :(得分:0)

$没有任何特殊含义。在您提到的行中,创建了列表 terms 的Iterator对象,然后使用该对象访问它的所有元素。对于变量名,我只是一个奇怪的选择。

答案 1 :(得分:0)

$只是标识符的一部分,即变量的名称。您只能使用几个特殊符号作为标识符的一部分。 $是其中之一。 (事实上​​,所有的货币符号都是允许的。)

它没有任何特殊含义。

但编译器使用它的一个地方是使用内部类时。然后它用于将Inner类的名称与主类分开 例如:MyClass$InnerClass1.class

答案 2 :(得分:0)

这看起来像是由反编译器“编写”的代码。不要指望反编译代码特别易读。对于它的价值,(人类)Java程序员可能会将您的问题中的代码编写为:

public static double regress(double x, ArrayList<Double> terms) {
    double a = 0.0;
    int exp = 0;
    for (double term : terms()) {
        a += term * Math.pow(x, exp);
        ++exp;
    }
    return a;
}

$字符是Java标识符中的合法字符,不同之处在于它是非正式保留的,用于编译器,源代码生成器和其他工具。强烈建议不要在人类书面代码中使用$。 正如JLS 3.8所说:

  

$符号只能用于机械生成的源代码,或者很少用于访问旧系统上预先存在的名称。

如果您不明智地使用$,可能会让您遇到麻烦。该字符用于内部类的合成名称,以及内部类引用封闭范围中的“有效最终”局部变量时使用的合成变量。如果您声明了自己的$变量,它们可能会与编译器的用法发生冲突,结果将是未定义的。

答案 3 :(得分:0)

i$只是变量的名称确实$是一个可用于定义Java标识符名称的字符。要检查是否允许某个字符(在Java标识符中除了第一个字符以外),您可以使用Character.isJavaIdentifierPart(char),如果使用$进行测试,则会得到true,如上所述Javadoc:

  

如果满足以下任何条件,则字符可能是Java标识符的一部分   是的:

     
      
  • 这是一封信

  •   
  • 这是一种货币符号(例如{@code&#39; $&#39;})

  •   
  • 它是一个连接标点字符(例如{@code&#39; _&#39;})

  •   
  • 这是一个数字

  •   
  • 它是一个数字字母(例如罗马数字字符)

  •   
  • 这是一个组合标记

  •   
  • 这是一个非间距标记

  •   
  • {@ code isIdentifierIgnorable}为字符返回{@code true}

  •   

答案 4 :(得分:0)

$是在标识符中使用的有效符号;这没什么特别的。

但请参阅JLS Section 3.8,这表明$通常不应在标识符中使用:

  

$ sign只能用于机械生成的源代码,或者很少用于访问旧系统上预先存在的名称。