变量名中的$符号是什么意思?

62

近来我读到在Java变量名中允许使用符号$,但是它具有特殊含义。遗憾的是并没有说明这个特殊含义。

因此我在这里提问:在Java变量名中$的特殊含义是什么?

以下是来自Walter Savitch的《Java编程导论》的确切引用:

Java确实允许美元符号$出现在标识符中,但这些标识符具有特殊含义,因此不应在标识符中使用美元符号$。


相关线程:https://dev59.com/b2025IYBdhLWcg3wLitX - KV Prajapati
引用你阅读的来源可能会更好。 - Don Roby
据我所知,它没有特殊的含义,因此您可以在变量声明中使用它。但是它违反了Java命名约定。也许他是在谈论类名? - Mister Smith
2
@MisterSmith 我怀疑作者所指的“特殊含义”只是惯例,即仅在机器生成的代码中使用它。这个“特殊含义”是按照惯例而非语义而特殊的。 - brandizzi
2个回答

62

$ 是编译器内部用来修饰某些名称的符号。维基百科给出了以下示例

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 引用。

最后,JLS 建议仅在机械生成的源代码中或极少数情况下在遗留系统中使用 $ 字符来访问先前存在的名称。


这并不完全正确。我可以将我的类命名为Test$。 - RoflcoptrException
5
这个问题不是在询问类名,而是在询问变量。 - Mister Smith
如果有一个名为 foo$bar 的类会发生什么?它的类文件如何与源代码中 foo 中的 bar 区分开来? - matj1

39

$在变量名中没有特殊含义。

虽然从技术上讲允许使用以美元符号开头的变量名,但这违反了约定,通常只由代码生成器使用。

引用Oracle的Java教程

变量名区分大小写。变量名可以是任何合法的标识符——一个以字母、美元符号"$"或下划线字符"_"开头的Unicode字母和数字序列(长度不限)。然而,惯例是始终使用字母作为变量名的开头,而不是 "$" 或 "_"。此外,美元符号字符按惯例根本不使用。您可能会发现一些自动生成的名称将包含美元符号,但是您的变量名应始终避免使用它。同样,对于下划线字符也存在类似的约定;虽然使用下划线作为变量名的开头在技术上是合法的,但实践中不建议这样做。不允许使用空格。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接