直接量是指在程序中通过源代码直接给出的值,例如在inta=5;代码中,为变量a所分配的初始值5就是一个直接量。
一、直接量的类型
并不是所有的数据类型都可以指定直接量,能指定直接量的通常只有三种类型:基本类型、字符串类型和null类型。具体而言,Java支持如下8种类型的直接量。
1)int类型的直接量
在程序中直接给出的整型数值,可分为二进制、十进制、八进制和十六进制4种,其中二进制需要以0B或0b开头,八进制需要以0开头,十六进制需要以0x或0X开头。例如123、012(对应十进制的10)、0x12(对应十进制的18)等。
2)long类型的直接量
在整型数值后添加l或L后就变成了long类型的直接量。例如3L、0x12L(对应十进制的18L)。
3)float类型的直接量
在一个浮点数后添加f或F就变成了float类型的直接量,这个浮点数可以是标准小数形式,也可以是科学计数法形式。例如5.34F、3.14E5f。
4)double类型的直接量
直接给出一个标准小数形式或者科学计数法形式的浮点数就是double类型的直接量。例如5.34、3.14E5。
5)boolean类型的直接量
这个类型的直接量只有true和false。
6)char类型的直接量
char类型的直接量有三种形式,分别是用单引号括起来的字符、转义字符和Unicode值表示的字符。例如‘a’,‘\n’和‘\u0061’。
7)String类型的直接量
一个用双引号括起来的字符序列就是String类型的直接量。
在大多数其他语言中,包括C/C++,字符串作为字符的数组被实现。然而,在Java中并非如此。在Java中,字符串实际上是对象类型。在教程后面你将看到,因为Java对字符串是作为对象实现的,因此,它有广泛的字符串处理能力,而且功能既强又好用。
8)null类型的直接量
这个类型的直接量只有一个值,即null。
在上面的8种类型的直接量中,null类型是一种特殊类型,它只有一个值:null。而且这个直接量可以赋给任何引用类型的变量,用以表示这个引用类型变量中保存的地址为空,即还未指向任何有效对象。
二、直接量的赋值
通常总是把一个直接想量赋值给对应类型的变量,例如下面代码都是合法的。
[Java] 纯文本查看 复制代码 int a = 5;
char c = 'a';
boolean b = true;
float f = 5.12f;
double d = 4.12;
String name = "C语言中文网";
String url = "http://c.biancheng.net";
除此之外,Java还支持数值之间的自动类型转换,因此允许把一个数值直接量直接赋给另一种类型的变量,这种赋值必须是系统所支持的自动类型转换,例如把int类型的直接量赋给一个long类型的变量。
String类型的直接量不能赋给其他类型的变量,null类型的直接量可以直接赋给任何引用类型的变量,包括String类型。boolean类型的直接量只能赋给boolean类型的变量,不能赋给其他任何类型的变量。
关于字符串直接量有一点需要指出,当程序第一次使用某个字符串直接量时,Java会使用常量池(constantpool)来缓存该字符串直接量,如果程序后面的部分需要用到该字符串直接量时,Java会直接使用常量池(constantpool)中的字符串直接量。
提示:
由于String类是一个典型的不可变类,因此String对象创建出来的就不可能改变,因此无需担心共享String对象会导致混乱。
常量池(constantpool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据,它包括关于类、方法、接口中的常量,也包括字符串直接量。
看如下程序:
[Java] 纯文本查看 复制代码 String s0 = "hello";
String s1 = "hello";
String s2 = "he" + "llo";
System.out.println(s0 == s1);
System.out.println(s0 == s2);
运行结果为:
[Java] 纯文本查看 复制代码 true
true
Java会确保每个字符串常量只有一个,不会产生多个副本。例子中的s0和s1中的“hello”都是字符串常量,它们在编译期就被确定了,所以s0=s1返回true。而“he”和“llo”也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它本身也是字符串常量,s2同样在编译期就被解析为一个字符串常量,所以s2也是常量池中“hello”的引用。因此,程序输出s0==s1返回true,s1==s2也返回true。
|