6.枚举、包装类
1.枚举:Enum Type
如果一个变量的取值只可能是固定的几个值,可以考虑使用枚举类型。(季节、方位)
枚举由一组预定义的常量构成。
枚举的本质是类,所有枚举类型都隐式继承自java.lang.Enum。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21public enum Session{
// 最后一个常量不用加分号
SPRING, SUMMER, FALL, WINTER
}
// 使用
Session s = Session.WINTER;
print(s.name()); // WINTER
print(s.ordinal()); // 3
// 如果在switch里,可不用写 Session.XXX,直接写XXX
Session session;
switch(session){
case SPRING:
xxx;
break;
case SUMMER:
xxx;
break;
}枚举定义完常量后,还可再定义成员变量,方法等。(这时最后一个枚举常量要以分号结束)
枚举的构造方法权限必须是 无修饰符 或 private
1
2
3
4
5
6
7
8
9
10public enum Session{
SPRING, SUMMER, FALL, WINTER;
public int sum = 10;
//构造方法私有化,防止外界通过new 方式创建枚举类
private Session(){
xxxx
}
}java会主动调用构造方法 来初始化每个常量,用户不能主动调用构造方法(因为编译器把构造方法用peivate修饰了)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19//上述的枚举 大致实现如下
public class Session{
private Session(){} // 构造方法
// 调用构造方法 来初始化每个常量
public static final Session SPRING = new Session();
public static final Session SUMMER = new Session();
public static final Session FALL = new Session();
public static final Session WINTER = new Session();
}
// 调用
Session s = Session.SPRING
if(s == Session.SPRING){
}
1.1.自定义了构造方法 的枚举
1 | public enum Session{ |
2.包装类
2.1.基本类型的缺陷:
- 无法表示不存在的值(null)
- 不能利用面向对象的方式操作基本类型(如直接用基本类型调用方法)
- 当方法参数是引用类型时,基本类型无法传递。
解决方案:可以自己将基本类型包装成引用类型。
1 | public class IntObject{ |
2.2.包装类:Wrapper Class
- java内置了基本数据类型的包装类(java.lang包下)
- 自动装箱:java编译器会自动调用xxx.valueOf()方法,将基本类型转换为包装类(装包)。
- 自动拆箱:java编译器会自动调用xxxValue()方法,将包装类转换为基本类型(拆包)。
1 | Integer num = Integer.valueOf(10); |
2.3.包装类的判等(不要使用 ==、!=,应该使用equals方法。)
DK1.5后, 包装类型Integer、Short、Byte、Character、Long都使用了缓存技术。
1 | // 1.IntegerCache 类中缓存了[-128, 127]范围的Integer对象 |
2.4.【基本类型数组】与【包装类数组】之间是不能自动装箱、拆箱的。
1 | void test1(Integer[] nums){省略方法体...} |
2.5.高精度计算:
float
、double
存储的只是小数的近似值,并非精确值,因此不适合用来做高精度计算。
1 | double d1 = 0.7; |
建议使用java.math.BigDecimal
来进行高精度计算。
1 | new BigDecimal(0.7); //浮点数本来就不准确,这么传,结果依然不准确 |
字符串与数字互相转化:
字符串转数字:使用包装类的
valueOf()
、parseXX()
方法1
2
3
4
5
6Integer i1 = Integer.valueOf("123"); // 123
int i2 = Integer.parseInt("123"); // 123
int i3 = Integer.parseInt("FF", 16); // 255 (十六进制解析FF)
Float i1 = Float.valueOf("12.3"); // 12.3
float i1 = Float.parseFloat("12.3"); // 12.3数字转字符串:使用字符串的
valueOf()
方法,包装类的toString()
方法1
2
3
4String str1 = String.valueOf(12.3); // 12.3
String str2 = Integer.toString(123); // 255
String str1 = Integer.toString(255, 16); // FF
String str1 = Float.toString(12.3f); // 12.3