语法话题
本期的语法话题为:
true,false与null是关键字吗(保留关键字)?
关键字分类
从Java 17起,关键字分为两种:
- 保留关键字
- 上下文关键字
其中,保留关键字指在Java 17前所定义的关键字,例如,if,class等。而上下文关键字指在特定的上下文环境中,会解析为特殊的含义,例如,var,record等。不过,像var,record在Java 17前就已经在使用(具有特殊的含义),只不过官方没有将其称为“上下文关键字”。
本话题中,我们提及的关键字,指的是保留关键字。
结论
在很多集成开发环境中,true,false,null往往使用特殊的颜色高亮显示,这便增加了这三个符号的混淆性,很多Java初学者会认为这三个符号也是关键字。然而,这是错误的。在Java语言中,这三个符号是三个字面常量值。其中,true与false是布尔类型的字面常量,null是引用类型的字面常量。这就好比“abc”是String类型的字面常量,数值“5”是int类型的字面常量一样。
语法解析
如此一来,这三个符号不是很平常了吗?似乎没有必要将其单独列出。也不是,还是有一些差别的。尽管true,false,null不是关键字,但是,也不能将其作为标识符使用,否则同样会产生编译错误。从这一点来说,这三个字面常量与关键字的表现是相似的。
至于true,false与null不能声明为标识符的原因,可以解释如下:
- 第一,从简单的角度讲,就像其他类型(例如int类型)的字面常量一样,我们不能将数值1或20声明为标识符,因而,也同样不能将布尔类型或引用类型的字面常量(true,false与null)声明为标识符。
- 第二,从语法的角度讲,编译器在解析符号的时候,对于某一个符号T,如果T同时可以解析为标识符或者字面常量,则总是会解析为字面常量。因此,程序中只要出现true(false或null),则一定会解析为字面常量,而不是标识符。