Java基础14(Enum 枚举类 BigInteger类BigDecimal类 内部类)

目录

一. Enum 枚举类

1. enum的定义

2. enum的比较:

3. enum类型

4. enum方法

4.1 name()方法

4.2 ordinal()方法

4.3 toString()方法

5. switch 

6. 小结

二. BigInteger类 

三. BigDecimal类 

1. 一些方法

1.1 scale()方法

1.2 stripTrailingZeros()方法

1.3 setScale()方法

1.4 一些运算

1.5 divideAndRemainder()方法

2. 比较BigDecimal

四. Random类和SecureRandom类

1. Random类

2. SecureRandom类

五. 内部类

1. Inner Class 内部类

2. Anonymous Class 匿名类

3. Static Nested Class静态内部类


一. Enum 枚举类

1. enum的定义

为了让编译器能自动检查某个值在枚举的集合内,并且,不同用途的枚举需要不同的类型来标记,不能混用,我们可以使用enum来定义枚举类

枚举类Weekday :

public enum Weekday {
	SUN, MON, TUE, WED, THU, FRI, SAT;
}

枚举类Color:

public enum Color {
    RED, GREEN, BLUE;
}

测试类:

public static void main(String[] args) {
        //设置枚举值:
		//编译器帮助我们进行数据类型的校验,以及取值范围的校验
		Weekday day = Weekday.SUN;
		if (day == Weekday.SAT || day == Weekday.SUN) {
			System.out.println("休息");
		} else {
			System.out.println("学习");
		}
	}

枚举和int定义的常量相比,使用enum定义枚举有如下好处:
●enum常量本身带有类型信息,即Weekday.SUN类型是Weekday,编译器会自动检查出类型错误例如,下面的语句不可能编译通过:

int day = 1;

// Compile error: bad operand types for binary operator '=='
if (day == Weekday.SUN) {
    
}

●不可能引用到非枚举的值,因为无法通过编译。
●不同类型的枚举不能互相比较或者赋值,因为类型不符。
例如,不能给一个Weekday枚举类型的变量赋值为Color枚举类型的值:

Weekday x = Weekday.SUN; // ok!
Weekday y = Color.RED; // Compile error: incompatible types

2. enum的比较:

引用类型比较,要使用equals()方法,如果使用==比较,它比较的是两个引用类型的变量是否是同一个对象。因此,引用类型比较,要始终使用equals()方法,但enum类型可以例外。

因为enum类型的每个常量在JVM中只有一个唯一实例,所以可以直接用比较:

Weekday day = Weekday.SUN;
		if (day == Weekday.SAT || day == Weekday.SUN) {
			System.out.println("休息");
		}

3. enum类型

enum定义的类型就是class,只不过它有以下几个特点:
●定义的enum类型总是继承自java.lang.Enum,且无法被子类继承;
●只能定义出enum的实例,而无法通过new操作符创建enum的实例;
●定义的每个实例都是引用类型的唯一实例;
●可以将enum类型用于switch语句。

Color枚举类:

public enum Color {
	RED(1, "红色"), BLUE(2, "蓝色"), GREEN(3, "绿色");

	private final int value;
	private final String name;

	private Color(int value, String name) {
		this.value = value;
		this.name = name;
	}

	@Override
	public String toString() {
		return value + name;
	}

	public int getValue() {
		return value;
	}

	public String getName() {
		return name;
	}

}

Color01类:

public final class Color01  { // extends Enum
    // 每个实例均为全局唯一:
    public static final Color01 RED = new Color01(1,"红色");
    public static final Color01 BLUE = new Color01(2,"蓝色");
    public static final Color01 GREEN = new Color01(3,"绿色");
    
    public final int value;
    public final String name;
	
	// private构造方法,确保外部无法调用new操作符:
	private Color01(int value, String name) {
		super();
		this.value = value;
		this.name = name;
	}
}

编译后的enum类和普通class并没有任何区别。但是我们自己无法按定义普通class那样来定义enum,必须使用enum关键字,这是Java语法规定的。

4. enum方法

由于enum是一个class,每个枚举的值都是class实例,因此,这些实例有一些方法:

4.1 name()方法

作用:返回常量名

//name()作用:返回常量名
		String colorName = Color.BLUE.name();
		System.out.println(colorName);//BLUE

4.2 ordinal()方法

作用:返回定义的常量的顺序,从0开始计数

//ordinal()作用:返回定义的常量的顺序,从0开始计数
		int i = Color.BLUE.ordinal();
		System.out.println(i);//1

因为enum本身是class,所以我们可以定义private的构造方法,并且,给每个枚举常量添加字段,这样就无需担心顺序的变化,新增枚举常量时,也需要指定一个int值.

public enum Color {
	RED(1, "红色"), BLUE(2, "蓝色"), GREEN(3, "绿色");

	private final int value;
	private final String name;

	private Color(int value, String name) {
		this.value = value;
		this.name = name;
	}
@Override
	public String toString() {
		return value + name;
	}
}

注意:枚举类的字段也可以是非final类型,即可以在运行期修改,但是不推荐这样做!

4.3 toString()方法

作用:默认情况下,对枚举常量调用toString()会返回和name()一样的字符串。但是,toString()可以被覆写,而name()则不行。

//toString()默认情况下,会返回和name()一样的字符串,但是此方法没有重写,我们可以手动进行重写
		String str1 = Color.BLUE.toString();
		System.out.println(str1);//2蓝色
public enum Color {
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冯诺依曼转世

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值