近来我读到在Java变量名中允许使用符号$,但是它具有特殊含义。遗憾的是并没有说明这个特殊含义。
因此我在这里提问:在Java变量名中$的特殊含义是什么?
以下是来自Walter Savitch的《Java编程导论》的确切引用:
Java确实允许美元符号$出现在标识符中,但这些标识符具有特殊含义,因此不应在标识符中使用美元符号$。
近来我读到在Java变量名中允许使用符号$,但是它具有特殊含义。遗憾的是并没有说明这个特殊含义。
因此我在这里提问:在Java变量名中$的特殊含义是什么?
以下是来自Walter Savitch的《Java编程导论》的确切引用:
Java确实允许美元符号$出现在标识符中,但这些标识符具有特殊含义,因此不应在标识符中使用美元符号$。
$
是编译器内部用来修饰某些名称的符号。维基百科给出了以下示例:
public class foo {
class bar {
public int x;
}
public void zark () {
Object f = new Object () {
public String toString() {
return "hello";
}
};
}
}
编译此程序将会生成三个 .class 文件:
foo.class
,包含主类 foo
foo$bar.class
,
包含命名的内部类 foo.bar
foo$1.class
,包含匿名内部类(局部于方法 foo.zark
)所有这些类名都是有效的(因为在 JVM 规范中允许使用 $
符号)。
同样地,javac
在一些自动生成的变量名中使用 $
:例如,this$0
和其他类似的变量名用于内部类对其外部类的隐式 this
引用。
foo$bar
的类会发生什么?它的类文件如何与源代码中 foo
中的 bar
区分开来? - matj1$
在变量名中没有特殊含义。
虽然从技术上讲允许使用以美元符号开头的变量名,但这违反了约定,通常只由代码生成器使用。
引用Oracle的Java教程:
变量名区分大小写。变量名可以是任何合法的标识符——一个以字母、美元符号"$"或下划线字符"_"开头的Unicode字母和数字序列(长度不限)。然而,惯例是始终使用字母作为变量名的开头,而不是 "$" 或 "_"。此外,美元符号字符按惯例根本不使用。您可能会发现一些自动生成的名称将包含美元符号,但是您的变量名应始终避免使用它。同样,对于下划线字符也存在类似的约定;虽然使用下划线作为变量名的开头在技术上是合法的,但实践中不建议这样做。不允许使用空格。