【问题标题】:For what is the symbol $ after a variable in Java?Java中变量后面的符号$是什么?
【发布时间】:2016-08-18 18:44:33
【问题描述】:

我正在查看我在互联网上找到的一个程序,并试图弄清楚它是如何工作的,但我找不到任何可以帮助我的功能。

 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&lt;Double&gt; i$ = terms.iterator(); 是什么意思?更具体地说,在变量i 之后使用的这个符号$ 是什么?

【问题讨论】:

标签: java arraylist iterator


【解决方案1】:

这看起来像是由反编译器“编写”的代码。不要期望反编译的代码特别可读。对于它的价值,(人类)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 所说:

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

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

【讨论】:

    【解决方案2】:

    i$ 只是变量的名称,实际上$ 是一个可用于定义 Java 标识符名称的字符。要检查是否允许使用字符(在 Java 标识符中,而不是第一个字符),您可以使用 Character.isJavaIdentifierPart(char),如果您使用 $ 测试它,您将得到 true,如 Javadoc 中所述:

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

    • 是个字母

    • 是货币符号(如{@code '$'})

    • 是连接标点符号(如{@code '_'})

    • 是一个数字

    • 是数字字母(如罗马数字字符)

    • 它是一个组合标记

    • 它是一个非间距标记

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        它没有任何特殊含义。

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

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

            猜你喜欢
            • 2019-09-16
            • 2019-09-13
            • 2014-01-11
            • 1970-01-01
            • 2011-03-20
            • 2021-05-27
            • 2014-10-10
            • 1970-01-01
            • 2014-08-02
            相关资源
            最近更新 更多