【问题标题】: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<Double> 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 标识符的一部分
是真的:
【解决方案3】:
$ 没有任何特殊含义。在您提到的行中,创建了列表 terms 的 Iterator 对象,然后用于访问它的所有元素。 i$ 只是一个奇怪的变量名选择。
【解决方案4】:
$ 只是标识符的一部分,即变量的名称。您只能使用少数特殊符号作为标识符的一部分。 $就是其中之一。 (实际上所有的货币符号都是允许的)。
它没有任何特殊含义。
但是编译器使用它的一个地方是当你使用内部类时。然后它用于将Inner类的名称与主类分开。
例如:MyClass$InnerClass1.class
【解决方案5】:
$ 是在标识符中使用的有效符号;没什么特别的意思。
但是,请参阅 JLS Section 3.8,这表明 $ 通常不应用于标识符:
$ 符号应仅用于机械生成的源代码中,或者很少用于访问旧系统上预先存在的名称。