在 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/