话题2 世外隐者——隐居深山的“关键字”
抛砖引玉:
这是一个非常典型的面试题:在Java中有没有goto?
除了goto,今天我们还要谈到几个特别的标识,分别是const、true、false、null。这些标识在Java语言中,是不是关键字呢?如果是,该如何使用?如果不是,与普通的标识符是否又存在什么区别?
重点摘要:
· goto与const是否为关键字
· true、false与null是什么
· Java中所有的关键字
goto与const 面试
在C / C++等语言中,使用goto可以实现程序的跳转,从某些方面来说其提供了一定的方便性,例如,在多重嵌套的循环中,可以直接从内层循环中跳出外层循环。然而,这种跳转却没有任何限制,可以随意地进行,从而打破了正常的程序流程。如果程序中多处使用goto,不仅降低程序的可读性,也会对程序的维护与更新造成影响。
因此,为了避免上述情况,Java语言取消了goto的使用,取而代之的是使用循环标签。但是,为了避免程序员自行使用goto带来同样的混乱性(例如将方法或变量的名称声明为goto),Java语言仍将goto定义为一个关键字,用来限制程序员将goto作为一个标识符来使用,由于是一个从不使用的关键字,故也称为“保留字”。下面的程序将给予说明。
【例1.1】goto的说明。
1. package chapter1; 2. 3. public class GotoTest { 4. public static void main(String[] args) { 5. int[][] array = { 6. { 1, 20, 38 }, 7. { 28, 90 }, 8. { 60, 46, 71, 100 } 9. }; 10. //int goto = 0; 错误,不能使用goto作为标识符。 11. int number = 0; 12. outer: 13. for (int i = 0; i < array.length; i++) { 14. for (int j = 0; j < array[i].length; j++) { 15. System.out.println(array[i][j]); 16. number++; 17. if (number == 5) { 18. //goto here; 错误,在Java中没有这种语法。 19. break outer; //使用循环标签代替goto。 20. } 21. } 22. } 23. here: 24. System.out.println(number); 25. } 26. }
程序运行结果如下:
1 20 38 28 90 5
该程序实现打印二维数组的元素,如果数组元素多于5个,则后面的数组元素将不再打印。在Java语言中,没有类似C / C++中的goto语法,因此,如果取消程序第18行的注释,将会产生编译错误,我们应当使用break加循环标签来跳出外层循环(第19行)。
尽管如此,goto依然是Java中的一个关键字,不允许作为标识符来使用。例如,如果试图使用goto作为一个变量(类、方法等)的名称,同样会产生编译错误(第10行)。
在C / C++中,const是一个关键字,用来声明一个变量的值是不可改变的(即我们通常所谓的常量),与goto类似,Java语言也将const定义为关键字,但是却没有任何语法应用,也就是保留字。使用const来作为标识符也是不允许的。
true、false与null 面试 误区
在很多集成开发环境中,true、false、null往往使用与关键字相同的特殊颜色给以标出,这便增加了这3个符号的混淆性,很多人认为这3个符号也是关键字。然而,这是错误的。在Java语言中,这3个符号是3个字面常量(也称直接量)。其中,true与false是布尔类型的字面常量,null是引用类型的字面常量。这些就好比“abc”是String类型的字面常量,而数值“5”是int类型的字面常量一样。
这么说来,这3个符号不是很平常了吗?似乎没有必要将其单独列出。也不是,还是有一些差别的。尽管true、false、null不是关键字,但是,也不能将其作为标识符使用,否则同样会产生编译错误。从这一点来说,这3个字面常量与关键字的表现是相似的。
【例1.2】3个字面常量。
1. package chapter1; 2. 3. public class ThreeLiteral { 4. //byte true = 1; 5. //char false = 'A'; 6. //int null = 232; 7. 8. //void true() { } 9. 10. //class false { } 11. 12. //interface null { } 13. }
在本程序中,取消4~12行中任意一行代码的注释均会产生编译错误,这说明true、false、null不能当作标识符来使用。
关键字列表 面试
在Java中,关键字如表1-1所示,其中goto与const为保留字,到目前为止尚未使用。
■ 表1-1 关键字
要点总结
· 在Java中,goto与const作为保留的关键字而存在,虽然未在程序中使用,但是也禁止程序员将其作为标识符来使用。
· true、false与null是3个字面常量,并非Java中的关键字,在程序中也禁止作为标识符使用。
➔举一反三←
· 指出下面一系列符号中,哪些是Java中的关键字。
sizeof、String、volatile、NULL、then、friend、enum、true、bool、goto、end