Java 继承的综合案例【发红包】

综合案例:群主发普通红包

群主发普通红包。某群有多名成员,群主给成员发普通红包。普通红包的规则:

  1. 群主的一笔金额,从群主余额中扣除,平均分成n等份,让成员领取。
  2. 成员领取红包后,保存到成员余额中。

请根据描述,完成案例中所有类的定义以及指定类之间的继承关系,并完成发红包的操作。

案例分析

根据描述分析,得出如下继承体系:
在这里插入图片描述

案例实现

定义用户类:

public class User {
	// 成员变量
	private String username; // 用户名
	private double leftMoney; // 余额
	// 构造方法
	public User() { }
	public User(String username, double leftMoney) {
		this.username = username;
		this.leftMoney = leftMoney;
	}
	// get/set方法
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public double getLeftMoney() {
		return leftMoney;
	}
	public void setLeftMoney(double leftMoney) {
		this.leftMoney = leftMoney;
	}
	// 展示信息的方法
	public void show() {
		System.out.println("用户名:"+ username +" , 余额为:" + leftMoney + "元");
	}
}

定义群主类:

public class QunZhu extends User {
	// 添加构造方法
	public QunZhu() {
	}
	public QunZhu(String username, double leftMoney) {
		// 通过super 调用父类构造方法
		super(username, leftMoney);
	}
	/*
	群主发红包,就是把一个整数的金额,分层若干等份。
	1.获取群主余额,是否够发红包.
	不能则返回null,并提示.
	能则继续.
	2.修改群主余额.
	3.拆分红包.
	3.1.如果能整除,那么就平均分。
	3.2.如果不能整除,那么就把余数分给最后一份。
	*/
	public ArrayList<Double> send(int money, int count) {
		// 获取群主余额
		double leftMoney = getLeftMoney();
		if(money > leftMoney) {
			return null;
		}
		// 修改群主余额的
		setLeftMoney(leftMoney ‐ money);
		// 创建一个集合,保存等份金额
		ArrayList<Double> list = new ArrayList<>();
		// 扩大100倍,相当于折算成'分'为单位,避免小数运算损失精度的问题
		money = money * 100;
		// 每份的金额
		int m = money / count;
		// 不能整除的余数
		int l = money % count;
		// 无论是否整除,n‐1份,都是每份的等额金额
		for (int i = 0; i < count ‐ 1; i++) {
			// 缩小100倍,折算成 '元'
			list.add(m / 100.0);
		}
		// 判断是否整除
		if (l == 0) {
			// 能整除, 最后一份金额,与之前每份金额一致
			list.add(m / 100.0);
		} else {
			// 不能整除, 最后一份的金额,是之前每份金额+余数金额
			list.add((m + l) / 100.00);
		}
		// 返回集合
		return list;
	}
}

定义成员类:

public class Member extends User {
	public Member() {
	}
	public Member(String username, double leftMoney) {
		super(username, leftMoney);
	}
	// 打开红包,就是从集合中,随机取出一份,保存到自己的余额中
	public void openHongbao(ArrayList<Double> list) {
		// 创建Random对象
		Random r = new Random();
		// 随机生成一个角标
		int index = r.nextInt(list.size());
		// 移除一个金额
		Double money = list.remove(index);
		// 直接调用父类方法,设置到余额
		setLeftMoney( money );
	}
}

定义测试类:

public class Test {
	public static void main(String[] args) {
		// 创建一个群主对象
		QunZhu qz = new QunZhu("群主" , 200);
		// 创建一个键盘录入
		Scanner sc = new Scanner();
		System.out.println("请输入金额:");
		int money = sc.nextInt();
		System.out.println("请输入个数:");
		int count = sc.nextInt();
		// 发送红包
		ArrayList<Double> sendList = s.send(money,count);
		// 判断,如果余额不足
		if(sendList == null){
		System.out.println(" 余额不足...");
		return;
		}
		// 创建三个成员
		Member m = new Member();
		Member m2 = new Member();
		Member m3 = new Member();
		// 打开红包
		m.openHongbao(sendList);
		m2.openHongbao(sendList);
		m3.openHongbao(sendList);
		// 展示信息
		qz.show();
		m.show();
		m2.show();
		m3.show();
	}
}

案例扩展:

  1. 如果成员的余额不为0呢,将如何处理?
  2. 如果群主想输入带小数的金额呢,将如何处理?

我是知识的搬运工,该篇文章内容借助于高端IT教育品牌——黑马程序员。

发布了71 篇原创文章 · 获赞 57 · 访问量 2829

猜你喜欢

转载自blog.csdn.net/qq_46018521/article/details/105217641