常量分类
常量,程序运行期间,不发生改变的量
- 整型常量:100,200,-300等
- 浮点型常量:100.0,-3.14,0.0等
- 布尔常量:只有true、false两个取值
- 字符常量:英文单引号,‘A’,‘B’,‘1’,‘中’ 等,长度必须是1
- 字符串常量:英文双引号,“”,“abc”,“ABH”,“1230”,"中国"等,长度任意
- 空常量:null
Student[] stus = new Student[3];
System.out.println(stus[0]);// null
// 不能直接打印空常量null
// Ambiguous method call.
// Both println (char[]) in PrintStream and println (String) in PrintStream match
// System.out.println(null);// 标红报错
常量优化
- 右侧常量值没有超过左侧的数据范围
- 右侧不存在变量,同时满足两个条件,符合常量优化机制
一、对于byte/short/char类型
Java编译器自动隐含地进行强制类型转换
// int --> byte 右边没有变量
byte num1 = -128;
// int + int = int --> short 右边没有变量
short num2 = 1 + 2;
// int --> char 右边没有变量
char c1 = 65535;
final int var1 = 1; // final常量
byte res1 = var1 + 1; // 常量优化机制
二、对于字符串String类型
字符串字面量在编译时确定,存储在字符串常量池中
String str1 = "hello";
String str2 = "world";
String str3 = "helloworld";
String str4 = "hello" + "world"; // 右侧是常量
System.out.println(str3 == str4); // true
String str5 = str1 + str2; // 右边有变量
System.out.println(str3 == str5); // false
// final关键字,常量
final String str6 = "hello";
final String str7 = "world";
String str8 = str6 + str7; // 右侧是常量
System.out.println(str3 == str8); // true
// public String intern() 字符串取自字符串常量池
String str9 = (str1 + str2).intern();
System.out.println(str3 == str9); // true