Jim*_*ang 14 java compiler-construction class
在Java中,我可以声明一个变量,其名称与其类名完全相同.我认为这是一个如此令人困惑和奇怪的设计.
所以我在下面的代码片段中有一个问题:编译器如何区分ClassName,它引用了变量名或类名?
在运行结果中,编译器引用ClassName为变量名称.
class ClassName{}
public class Test {
public static void main(String[] args){
ClassName ClassName = new ClassName();
System.out.println(ClassName); //ClassName@18fb53f6
}
}
Run Code Online (Sandbox Code Playgroud)
Rea*_*tic 19
编译器可以通过上下文来判断.在您给出的示例中:
ClassName ClassName = new ClassName();
1 2 3
Run Code Online (Sandbox Code Playgroud)
它可以看出1是类型名称应该是的位置,因此它知道你的意思是类.然后,2是预期变量名称的位置,因此它知道这应该是变量的名称.而3是未来后new用括号关键字,所以它必须是一个类的名称.
System.out.println( ClassName );
Run Code Online (Sandbox Code Playgroud)
在这个例子中,ClassName是在参数传递的上下文中.类型名称不能作为参数传递,因此您必须表示变量的名称.
为了娱乐自己,您可以将print语句更改为:
System.out.println( ClassName.class );
Run Code Online (Sandbox Code Playgroud)
将鼠标光标悬停在上面ClassName,您将看到编译器将其识别为类的名称.然后将其更改为:
System.out.println( ClassName.getClass() );
Run Code Online (Sandbox Code Playgroud)
再次悬停光标,现在您看到它将其识别为变量名称.那是因为.class只能应用于类型名称,而getClass()只能应用于对象引用.print语句的结果在两种情况下都是相同的 - 但是通过不同的机制.
所以编译器在这里没有问题.但你是对的,它对人类来说是不可读的.惯例是变量和方法的名称必须以小写字母开头,而类型名称必须以大写字母开头.遵守这一惯例将确保不会出现这种可读性问题.
我不能确切地说为什么Java的作者选择不执行这个约定(也就是说,如果类型名称以小写字母开头或变量/方法名称以大写字母开头,则给出编译器错误),但我推测它们没有我不想做任何实际的错误,除非它实际上会导致编译器的歧义.编译错误应该表明编译器无法完成其工作的问题.
| 归档时间: |
|
| 查看次数: |
10650 次 |
| 最近记录: |