java - 在Java中,变量名可以和类名相同

标签 java class compiler-construction

在 Java 中,我可以声明一个变量,其名称与其类名完全相同。我认为这是一个令人困惑和奇怪的设计。

所以我在下面的代码片段中有一个问题:编译器如何区分ClassName,它引用了变量名称或 名字?

在运行结果中,编译器将ClassName作为变量名引用。

class ClassName{}

public class Test {
    public static void main(String[] args){
        ClassName ClassName = new ClassName();
        System.out.println(ClassName); //ClassName@18fb53f6
    }
}

最佳答案

编译器可以根据上下文判断。在您给出的示例中:

ClassName ClassName = new ClassName();
    1         2               3

它可以看到 1 是类型名称所在的位置,因此它知道您指的是类。然后,2 是期望变量名的地方,因此它知道这应该是变量名。而 3 是在带括号的 new 关键字之后,所以它必须是一个类的名称。

System.out.println( ClassName );

在这种情况下,ClassName 处于参数传递的上下文中。类型名称不能作为参数传递,因此您必须指的是变量的名称。

为了自娱自乐,您可以将打印语句更改为:

System.out.println( ClassName.class );

将鼠标光标悬停在 ClassName 上,您会看到编译器将其识别为类名。然后将其更改为:

System.out.println( ClassName.getClass() );

再次将光标悬停,现在您会看到它将它识别为变量名。那是因为 .class 只能应用于类型名称,而 getClass() 只能应用于对象引用。 print 语句的结果在这两种情况下都是相同的 - 但通过不同的机制。

所以这里编译器没有问题。但是你是对的,它对人类来说是不可读的。约定是变量和方法的名称必须以小写字母开头,而类型名称必须以大写字母开头。遵守此约定将确保不会出现此类可读性问题。

我不能确切地说出为什么 Java 的作者选择不强制执行此约定(也就是说,如果类型名称以小写字母开头或变量/方法名称以大写字母开头,则会给出编译器错误),但我推测他们不想让任何事情成为真正的错误,除非它实际上会导致编译器产生歧义。编译错误应该表示使编译器无法完成其工作的问题。

关于java - 在Java中,变量名可以和类名相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27877897/

相关文章:

python - 在python中访问超(父)类变量

java - 如何使一个类方法与数组中的另一个类方法一起使用?

python - Python 如何区分 Int 和 Double

java - Eclipse 和 Android Activity 中的错误似乎无法弄清楚

java - 如何用 Java 重新绘制面板?

大量迭代后,Java while 循环会随着时间的推移而显着变慢

c++ - 为什么我有一个 '=' 符号输出和 2 个笑脸而不是正确的输出? C++

java - 不优化编译Java?

java - 当我尝试使用切入点和通配符表达式创建 Bean 时,为什么会出现错误?

java - 可选 channel 上的操作和注册顺序重要吗?