群主给普通成员发红包:

  1. 首先分析对象的个数:两个对象,群主和普通成员。
  2. 寻找相同特性,观察是否有相同特性可以提升为父类:对于两个对象来说,都有相同的特性——用户名和余额。因此可以建立一个用户类作为父类,其中有两个对象共有的属性:用户名和余额。
  3. 找寻不同的特性:对于群主来说,存在一个发红包的方法;而对于普通成员来说,有一个收红包的方法。两者都属于对象中特有的方法
  4. 分析方法中的参数
  • 对于发红包的群主来说,对特有的发红包方法取名send;他的发的红包有两个属性——一共有多少钱(totalMoney)和分为多少分(count),最终返回的是一个数组类型的结果,即每个人可以抢到多少钱的一个列表
    所以定义特殊方法的格式为:
    public ArrayList<integer> send (int totalMoney , int count) {}
  • 对于接受红包的普通成员来说,只需要接收到一个红包的结果就行,所以创建一个接收红包方法receive,从发红包方法返回的数组里随机选取一个即可
    所以定义特殊方法的格式为:
    public void receive (Arraylist<integer> list) {}

发红包实例完整代码:

//两个对象的共同特性,用户类
package RedPacket;

public class User {
    private String name;  //姓名
    private int money;    //余额,当前用户拥有的钱数

    public User() {

    }

    public User(String name, int money) {
        this.name = name;
        this.money = money;
    }

    //展示成员有多少钱
    public void show(){
        System.out.println("我叫"+name+",我有"+money+"块钱");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }
}
//群主类
package RedPacket;
import java.util.ArrayList;

import java.util.ArrayList;

//群主类
public class Manager extends User {

    public Manager(){

    }

    public Manager(String name, int money) {
        super(name, money);
    }

    public void show(){
        if (super.getMoney() < 100){
            System.out.println("我叫"+super.getName()+",我破产了,我还有"+super.getMoney()+"块钱");
        }else{
            System.out.println("我叫"+super.getName()+",我还贼有钱,有"+super.getMoney()+"块钱");
        }
    }

    public ArrayList<Integer> sned(int totalMoney,int count){
        //先创建一个集合,用来存放若干个红包的金额
        ArrayList<Integer> redlist = new ArrayList<Integer>();

        //群主当前余额leftMoney
        int leftMoney = super.getMoney();
        //判断群主想要发的钱,是否比自己剩下的钱还要多,如果群主想要发的钱比自己剩余的金额还要多,那么会显示余额不足,并返回一个空的集合
        if (totalMoney >leftMoney){
            System.out.println("余额不足");
            return redlist;
        }

        //群主先扣钱,也就是重新设置自己的余额
        super.setMoney(leftMoney-totalMoney);

        //群主发红包需要设置每个红包的金额,也就是需要利用count去平均一下每个小红包的钱
        //但是对于需要发的钱很可能会出现一个余数,即有三个人,发20块钱的红包,必定会有2块钱的零头,所以需要将零头放到最后一个领取的红包里
        int avg = totalMoney / count;
        int mod = totalMoney % count;  //mod为零头

        //塞红包,将钱一个个的塞到红包当中
        if (mod == 0){
            for (int i = 0; i < count; i++) {
                redlist.add(avg);//如果没有零头,那么很好,每个人可得平均的钱,将平均的钱放到redlist中
            }
        }else{
            for (int i = 0; i < count-1; i++) {
                redlist.add(avg);//如果有零头,那么先把前几个放入平均的钱
            }
            int last = avg + mod;
            redlist.add(last);  //最后一个红包,加入零头,然后放入
        }
        return redlist;
    }
}
//普通成员类
package RedPacket;

import java.util.ArrayList;
import java.util.Random;

//普通成员类
public class Number extends User{
    public Number(){

    }

    public Number(String name, int money) {
        super(name, money);
    }

    public void receive(ArrayList<Integer> list){
        //从多个红包当中,随便抽取一个
        //随机获取集合当中的一个索引
        if (list.size() != 0){
            int index = new Random().nextInt(list.size());
            //根据索引值,从集合当中删除,并且的到被删除的红包
            int delta = list.remove(index);
            int money = super.getMoney();
            super.setMoney(money + delta);
            System.out.println("我是"+super.getName()+",我抢到了"+delta+"钱的红包,"+"我还有"+super.getMoney()+"块钱");
        }else{
            System.out.println("我叫"+super.getName()+"我没有抢到红包,贼惨!");
        }
    }
}
//main函数
package RedPacket;

import java.util.ArrayList;

public class MainRedPacket {
    public static void main(String[] args) {
        System.out.println("发红包前:");
        Manager manager = new Manager("群主大大",1000);
        manager.show();

        Number number1 = new Number("Tom",30);
        number1.show();

        Number number2 = new Number("Jerry",80);
        number2.show();

        Number number3 = new Number("Rain",10);
        number3.show();

        System.out.println("=============================================");
        System.out.println("发红包后");
        ArrayList<Integer> list = manager.sned(500,3);
        number1.receive(list);
        number2.receive(list);
        number3.receive(list);
        manager.show();
    }
}