直接量指的是程序中源代码直接给出的值,例如inta=5;代码中,赋给变量a的初值5是一个直接量。文字类型并非所有数据类型都可以指定文字。通常只有三种类型可以指定字面量:基本类型、字符串类型和空类型。具体来说,Java支持以下8种类型的文字。1)程序中直接给定的int类型的整数值分为二进制、十进制、八进制和十六进制四种,其中二进制需要以0B或0b开头,八进制需要以0,十进制必须以0开头。十六进制需要以0x或0X开头。例如123、012(对应十进制的10)、0x12(对应十进制的18)等。2)long型直接量在整数值后加l或L后成为long型直接量。比如3L,0x12L(对应十进制的18L)。3)浮点型直接量在浮点数后加f或F,成为浮点型直接量。这个浮点数可以是标准的十进制形式或科学记数法。例如5.34F、3.14E5f。4)double型直接量直接给出一个标准十进制形式或科学计数形式的浮点数,即double型直接量。例如,5.34、3.14E5。5)布尔类型文字。这种字面量只有true和false。6)char类型的字面量char类型的字面量有单引号括起来的字符、转义字符和Unicode值表示的字符三种形式。例如“a”、“\n”和“\u0061”。7)String类型字面量用双引号括起来的字符序列是String类型字面量。在大多数其他语言中,包括C/C++,字符串被实现为字符数组。然而,在Java中却不是这样。在Java中,字符串实际上是对象类型。正如您将在本教程后面看到的那样,因为Java将字符串作为对象来实现,所以它具有广泛的字符串处理功能,这些功能既强大又易于使用。8)null类型的字面量这种类型的字面量只有一个值,即null。在以上8种字面量类型中,null类型是一种特殊类型,它只有一个值:null。而这个直接量可以赋给任何一个引用类型变量,表示这个引用类型变量存储的地址为空,即还没有指向任何有效的对象。文字赋值通常总是将文字赋值给相应类型的变量。比如下面的代码都是合法的。inta=5;charc='a';booleanb=true;floatf=5.12f;doubled=4.12;Stringname="C语言中文网";Stringurl="xxx";另外Java也支持值之间的自动类型转换,因此允许直接将值字面量赋值给另一种类型的变量。这种赋值必须是系统支持的自动类型转换,比如直接将一个int类型的值赋值给一个long类型的变量。String类型字面量不能赋值给其他类型的变量,null类型字面量可以直接赋值给任何引用类型的变量,包括String类型。布尔类型的文字只能赋值给布尔类型的变量,不能赋给任何其他类型的变量。关于字符串字面量需要指出的一点是,当程序第一次使用字符串字面量时,Java会使用常量池(constantpool)来缓存这个字符串字面量。当使用字符串字面量时,Java会直接使用常量池(constantpool)中的字符串字面量。提示:由于String类是典型的不可变类,创建的String对象是不可能改变的,所以不用担心共享String对象带来的混乱。常量池(constantpool)是指编译时确定的一些数据,保存在编译后的.class文件中。它包括关于类、方法和接口的常量,以及字符串文字。看下面的程序:Strings0="hello";Strings1="hello";Strings2="he"+"llo";System.out.println(s0==s1);System.out.println(s0==s2);运行结果为:truetrueJava会保证字符串常量只有一个,不会产生多份。例子中s0和s1中的“hello”都是字符串常量,是在编译时确定的,所以s0=s1返回true。“he”和“llo”也是字符串常量。当一个字符串由多个字符串常量拼接而成时,它本身就是一个字符串常量,s2在编译时也会被解析成一个字符串常量,所以s2也是常量池中对“hello”的引用。所以程序输出s0==s1返回true,s1==s2也返回true。
