我正在审查我在互联网上发现的一个程序,而我正在试图弄清楚它是如何工作的,但我无法找到有关此功能的任何内容,这对我有帮助。
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
是什么?
答案 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只能用于机械生成的源代码,或者很少用于访问旧系统上预先存在的名称。