3.6.2 直接量的赋值
3.6.2 直接量的赋值
通常总是把一个直接量赋值给对应类型的变量,例如下面代码都是合法的
1 | int a =5: |
除此之外,Java
还支持数值之间的自动类型转换,因此允许把一个数值直接量直接赋给另一种类型的变量,这种赋值必须是系统所支持的自动类型转换,例如把int
类型的直接量赋给一个long
类型的变量。Java
所支持的数值之间的自动类型转换图如图3.10所示,箭头左边类型的直接量可以直接赋给箭头右边类型的变量;
如果需要把图3.10中箭头右边类型的直接量赋给箭头左边类型的变量,则需要强制类型转换。String
类型的直接量不能赋给其他类型的变量,null
类型的直接量可以直接赋给任何引用类型的变量,包括String
类型。boolean
类型的直接量只能赋给boolean
类型的变量,不能赋给其他任何类型的变量。
常量池
常量池(constant Pool
)指的是在编译期被确定,并被保存在已编译的.class
文件中的一些数据。它包括关于类、方法、接口中的常量,也包括字符串直接量。
当程序第一次使用某个字符串直接量时,Java
会使用常量池(constant Pool
)来缓存该字符串直接量,如果程序后面的部分需要用到该字符串直接量时,Java
会直接使用常量池(constant Pool
)中的字符串直接量。
由于String
类是一个典型的不可变类,因此String
对象创建出来就不可能被改变,因此无须担心共享String
对象会导致混乱。
看如下程序:
1 | String s0="hello"; |
运行结果为:
1 | jshell> /list |
Java
会确保每个字符串常量只有一个,不会产生多个副本。例子中的s0
和s1
中的”hello
“都是字符串常量,它们在编译期就被确定了,所以s0==s1
返回true
;
字符串常量的连接也是字符串常量
而”he
“和”llo
“也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它本身也是字符串常量,s2
同样在编译期就被解析为一个字符串常量,所以s2
也是常量池中”hello
“的引用。因此,程序输出s0==s1
返回true
,s1==s2
也返回true