Java深入解析:透析Java本质的36个话题
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

话题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