Day15

一、大数值运算类

1、整数类型的大数值运算类 - BigInteger

BigInteger 通过字符串进行赋值初始化,调用方法实现加减乘除

		BigInteger big1 = new BigInteger("123456789123456789123456789");	
		BigInteger big2 = new BigInteger("123456789123456789123456789");	
	
		BigInteger add = big1.add(big2);//加法
		System.out.println(add);
		
		BigInteger subtract = big1.subtract(big2);//减法
		System.out.println(subtract);
		
		BigInteger multiply = big1.multiply(big2);//乘法
		System.out.println(multiply);
	
		BigInteger divide = big1.divide(big2);//除法
		System.out.println(divide);
2、小数类型的大数值运算类 - BigDecimal

double类型在1以内的运算会损失精度

		BigDecimal big1 = new BigDecimal("0.5");	
		BigDecimal big2 = new BigDecimal("0.4");	
	
		BigDecimal add = big1.add(big2);//加法
		System.out.println(add);
		
		BigDecimal subtract = big1.subtract(big2);//减法
		System.out.println(subtract);
		
		BigDecimal multiply = big1.multiply(big2);//乘法
		System.out.println(multiply);
	
		BigDecimal divide = big1.divide(big2);//除法
		System.out.println(divide);

小数除法一定要设置保留几位小数 和 进制模式

		BigDecimal big1 = new BigDecimal("10");	
		BigDecimal big2 = new BigDecimal("3");	
	
		//除法
		//big1除以big2,保留俩位小数,并进行四舍五入
		BigDecimal divide = big1.divide(big2, 2, BigDecimal.ROUND_HALF_UP);
		System.out.println(divide);

二、枚举 ( Enum )

枚举引入:编写季节类(Season),该类只有四个对象(spring,summer,autumn,winter)

public class Season {
	
	public static final Season spring = new Season("春天", "万物复苏");
	public static final Season summer = new Season("夏天", "汗如雨下");
	public static final Season autumn = new Season("秋天", "秋高气爽");
	public static final Season winter = new Season("冬天", "寒风凛冽");

	private String name;
	private String info;
	
	private Season() {
	}

	private Season(String name, String info) {
		this.name = name;
		this.info = info;
	}
    
	. . . . . .

}

public class Test01 {
	
	public static void main(String[] args) {
		
		System.out.println(Season.spring);
		System.out.println(Season.summer);
		System.out.println(Season.autumn);
		System.out.println(Season.winter);
        
	}
}

也可以使用枚举解决这个问题,对象使用方式与上方代码相同

package com.dream.enum02;

//底层实现:public class Season extends Enum
public enum Season{

	//默认:public static final Season
	spring("春天","春雨绵绵"),
	summer("夏天","大汗淋漓"),
	autumn("秋天","硕果累累"),
	winter("冬天","银装素裹");
	
	private String name;
	private String info;
	
	private Season() {
	}

	private Season(String name, String info) {
		this.name = name;
		this.info = info;
	}
	
    ............
    
}

枚举里没有定义方法,可以在最后一个对象后面加逗号、分号或什么都不加

public enum Color {

	//枚举里没有定义方法,可以在最后一个对象后面加逗号、分号或什么都不加
//	RED,GREEN,BLUE
//	RED,GREEN,BLUE,
	RED,GREEN,BLUE;
}

枚举的常用方法

		//通过字符串获取到枚举类中的对象
		Season season1 = Enum.valueOf(Season.class, "spring");
		System.out.println(season1);
		
		//获取到Season枚举类中所有的对象
		Season[] values = Season.values();
		for (Season season : values) {
			System.out.println(season);
		}
		
		//通过字符串获取到枚举类中的对象
		Season season2 = Season.valueOf("summer");
		System.out.println(season2);
		
		//获取到枚举对象的名字
		String name = season2.name();
		System.out.println(name);
		
		//获取Season枚举类字节码文件对象
		Class<Season> c = season2.getDeclaringClass();
		System.out.println(c);

枚举案例 - 状态机

public enum Signal{
    RED, YELLOW, GREEN
}


public class Test01 {

	public static void main(String[] args) {
		/**
		 * 枚举案例 - 状态机
		 */

		Scanner scan = new Scanner(System.in);

		System.out.println("请输入信号灯:RED, YELLOW, GREEN");
		String next = scan.next();

		Signal signal = Signal.valueOf(next);

		switch (signal) {
		case RED:
			System.out.println("红灯停");
			break;
		case YELLOW:
			System.out.println("黄灯请注意");
			break;
		case GREEN:
			System.out.println("绿灯行");
			break;
		}

		scan.close();
	}
}


枚举案例 - 错误码/状态码

执行方法后通过返回状态码的枚举对象,便于处理状态信息和输出状态信息

public enum AddCode{
	ERROR_1(-1,"添加失败 - 学生信息不合法"),
	ERROR_2(-2,"添加失败 - 有重复学生"),
	OK(1,"添加成功");
	
	private int code;
	private String info;
	
	private AddCode() {
	}

	private AddCode(int code, String info) {
		this.code = code;
		this.info = info;
	}
 
    ............
	
	@Override
	public String toString() {
		return code + " -- " + info;
	}
}

枚举案例 - 组织枚举

使用类或者接口把众多的枚举组织起来

Java类在编译时会自动为 enum 类型加上static修饰符;

就是说,在类中组织 enum,如果你不给它修饰为 public,那么只能在本包中进行访问。


//使用类组织枚举
public class Code {
    
/**
//使用接口组织枚举
public interface Code{
*/
	//类默认添加static
    //接口默认添加public static
	enum UpdateCode{
		ERROR_1(-1,"修改失败 - 学生信息不合法"),
		ERROR_2(-2,"修改失败 - 没有该学生"),
		ERROR_3(-3,"修改失败 - 修改类型错误"),
		ERROR_4(-4,"修改失败 - 修改数据类型错误"),
		ERROR_5(-5,"修改失败 - 修改数据不合法"),
		ERROR_6(-6,"修改失败 - 目标班级上有该学生"),
		ERROR_7(-7,"修改失败 - 目标学号上有该学生"),
		OK(1,"修改成功");
		
		private int code;
		private String info;
		
		private UpdateCode() {
		}

		private UpdateCode(int code, String info) {
			this.code = code;
			this.info = info;
		}

		............
        
	}

	//类默认添加static
    //接口默认添加public static
	enum DeleteCode{
		ERROR_1(-1,"删除失败 - 学生信息不合法"),
		ERROR_2(-2,"删除失败 - 没有该学生"),
		OK(1,"删除成功");
		
		private int code;
		private String info;
		
		private DeleteCode() {
		}

		private DeleteCode(int code, String info) {
			this.code = code;
			this.info = info;
		}

		............
        
	}

	//类默认添加static
    //接口默认添加public static
	enum AddCode{
		ERROR_1(-1,"添加失败 - 学生信息不合法"),
		ERROR_2(-2,"添加失败 - 有重复学生"),
		OK(1,"添加成功");
		
		private int code;
		private String info;
		
		private AddCode() {
		}

		private AddCode(int code, String info) {
			this.code = code;
			this.info = info;
		}

		............
            
	}
}

Java接口在编译时会自动为enum类型加上public static修饰符;

经验:一般使用接口组织

枚举案例:策略枚举

需求:计算所有员工的工资

分析:
员工分类:行政人员、教师
行政人员:基本工资 + 绩效
教师:基本工资 + 课时费*课时 + 绩效

枚举中可以有抽象方法,但是该抽象方法必须有实现方法,即

enum Salary{
	java(StaffType.teacher),//java部门
	python(StaffType.teacher),//python部门
	principal(StaffType.administrative),//总经办(校长)部门
	reception(StaffType.administrative);//前台部门
	
	private StaffType staffType;
	
	private Salary(StaffType staffType) {
		this.staffType = staffType;
	}

	public double getSalary(double baseSalary, int classHour, 
                            double teachingHourSubsidy,double achievements){
        
		return staffType.calculationSalary(baseSalary, classHour, 				
                                           teachingHourSubsidy, achievements);
	}

	//员工类型
	enum StaffType{
		//匿名内部类的对象
		administrative{//行政人员类型
			@Override
			public double calculationSalary(double baseSalary, int classHour,
                             double teachingHourSubsidy,double achievements) {
				BigDecimal bigBaseSalary = 
                    				new BigDecimal(String.valueOf(baseSalary));
				BigDecimal bigAchievements = 
                    				new BigDecimal(String.valueOf(achievements));
				BigDecimal big = bigBaseSalary.add(bigAchievements);
				return big.doubleValue();
			}
		},
		teacher{//教师类型
			@Override
			public double calculationSalary(double baseSalary, int classHour, 
                                    double teachingHourSubsidy,double achievements) {
				BigDecimal bigBaseSalary = 
                    			new BigDecimal(String.valueOf(baseSalary));
				BigDecimal bigClassHour = 
                    			new BigDecimal(String.valueOf(classHour));
				BigDecimal bigTeachingHourSubsidy = 
                   				new BigDecimal(String.valueOf(teachingHourSubsidy));
				BigDecimal bigAchievements = 
                    			new BigDecimal(String.valueOf(achievements));
				BigDecimal big = 
                 bigClassHour.multiply(bigTeachingHourSubsidy).add(bigBaseSalary).add(bigAchievements);
				return big.doubleValue();
			}
		};
		
		//计算工资
        //该抽象方法对应上方内部枚举中匿名类对象
		public abstract double calculationSalary(double baseSalary,
                    int classHour,double teachingHourSubsidy,double achievements);
	}
}

枚举策略使用

		double salary1 = Salary.java.getSalary(1800, 88, 15, 400);
		System.out.println(salary1);
		
		double salary2 = Salary.principal.getSalary(20000, 0, 0, 20000);
		System.out.println(salary2);
		
		double salary3 = Salary.reception.getSalary(1200, 0, 0, 200);
		System.out.println(salary3);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值