3.6.2 直接量的赋值

3.6.2 直接量的赋值

通常总是把一个直接量赋值给对应类型的变量,例如下面代码都是合法的

1
2
3
4
5
6
int a =5:
char c='a';
boolean b= true;
float f= 5.12f
double d=4.12;
String str="HelloWorld";

除此之外,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
2
3
4
5
String s0="hello";
String s1 ="hello";
String s2 ="he"+"llo";
System.out.println( s0 == s1 );
System.out.println( s0 == s2 );

运行结果为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
jshell> /list

1 : String s0="hello";
2 : String s1 ="hello";
3 : String s2 ="he"+"llo";
4 : System.out.println( s0 == s1 );
5 : System.out.println( s0 == s2 );

jshell> /4
System.out.println( s0 == s1 );
true

jshell> /5
System.out.println( s0 == s2 );
true

Java会确保每个字符串常量只有一个,不会产生多个副本。例子中的s0s1中的”hello“都是字符串常量,它们在编译期就被确定了,所以s0==s1返回true;

字符串常量的连接也是字符串常量

而”he“和”llo“也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它本身也是字符串常量,s2同样在编译期就被解析为一个字符串常量,所以s2也是常量池中”hello“的引用。因此,程序输出s0==s1返回true,s1==s2也返回true