多态是同一个行为具有多个不同表现形式或形态的能力。
多态实现步骤:1)在抽象父类中定义抽象方法
2)子类继承抽象父类并重写父类中所有的抽象方法
3)测试类中创建父类引用指向不同的子类实例,父类引用调用方法,调用的是子类重写后的那些方法 多态的优点
- 1. 消除类型之间的耦合关系
- 2. 可替换性
- 3. 可扩充性
- 4. 接口性
- 5. 灵活性
- 6. 简化性
向上转型(自动类型转换):父类的引用指向子类的实例
向下转型(强制类型转换):子类的引用指向父类的引用
下面给大家分享一个发红包案例:
解析:一个群有群主,负责发红包,余额减少,红包分几份
群员负责收红包,余额增加,随机抢一个红包,
父类:User
public class User {
private String name;//姓名
private int money;//余额,也是当前用户的钱数
public User(String name, int money) {
super();
this.name = name;
this.money = money;
}
public User() {
super();
}
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;
}
//展示下当前用户多少钱
public void show(){
System.out.println("我叫:"+name+",我有多少钱:"+money);
}
群主发红包,余额减少:
import java.util.ArrayList;
public class Manager extends User {
public Manager(){
}
public Manager(String name, int money) {
super(name, money);
}
public ArrayList send(int totalMoney,int count){
//首先需要一个集合,用来存储若干个红包的金额
ArrayList redList = new ArrayList<>();
//首先看一下群主自己有多少钱
int leftMoney = super.getMoney();//群主当前余额
if(totalMoney>leftMoney){
System.out.println("余额不足");
return redList;
}
//扣钱,其实就是重新设余额
super.setMoney(leftMoney - totalMoney);
//发红包需要平均拆分成为count份
int avg = totalMoney / count ;
int mod = totalMoney % count;//余额,也是甩下的零头
//除不开的零头,包在最后一个红包中
//下面把红包一个一个放进集合中
for (int i = 0; i < count - 1; i++) {
redList.add(avg);
}
//最后一个红包
int last = avg + mod;
redList.add(last);
return redList;
}
}
群众抢红包,余额增加
import java.util.ArrayList;
import java.util.Random;
public class Member extends User {
public Member(){
}
public Member(String name, int money) {
super(name, money);
}
public void receive(ArrayList list){
//从多个红包中随便抽取一个,给我自己
//随机获取一个集合中的索引编号
int index = new Random().nextInt(list.size());
//根据索引,从集合当中删除,并且得到被删除的红包,给我自己
int delta = list.remove(index);
//当前对象自己有多少钱
int money = super.getMoney();
//加法 ,并且重新设置过去
super.setMoney(money + delta);
}
}
最后来一个测试类:
import java.util.ArrayList;
public class MainRedPackjet {
public static void main(String[] args) {
Manager manager = new Manager("群主", 100);
Member one = new Member("成员A", 0);
Member two = new Member("成员B", 0);
Member three = new Member("成员C", 0);
manager.show();
one.show();
two.show();
three.show();
System.out.println("===================================");
//群主总共发20块,分3个红包
ArrayList redList = manager.send(20, 3);
//三个普通成员收红包
one.receive(redList);
two.receive(redList);
three.receive(redList);
manager.show();//100-20=80
//6,6,8,随机给三个人
one.show();
two.show();
three.show();
}
}
运行结果:



