1.抽象类和抽象方法的介绍以及使用
抽象方法的概念:如果父类当中的方法不确定如何进行方法体{ }的实现,那么这就应该是一个抽象方法
1.1 抽象方法和抽象类的格式
抽象方法:就是在普通成员方法的基础上加上abstract 关键字 然后去掉大括号,直到分号结束
抽象类:抽象方法所在的类,必须是抽象类才行,在class前面加上abstract,抽象类没有方法体 { }
抽象方法是方法的概括,而一个个具有差异化方法的实现是抽象方法的具体。
1.2抽象类和抽象方法的使用
1.不能直接创建抽象类对象
2.必须用一个子类来继承抽象父类
3.子类必须覆盖重写父类当中所有的抽象方法。
覆盖重写(实现):子类去掉抽象方法的abstract关键字,然后补上方法体和大括号
4.创建子类对象进行使用
//抽象父类
public abstract class Animal {
//这是一个抽象方法,代表着吃东西,但是具体吃什么(大括号的内容)不确定。
public abstract void eat();
//这是普通的成员方法
public void method()
{
}
}
//子类
public class cat extends Animal{
public void eat()
{
System.out.println("猫吃鱼");
}
public static void main(String[] args) {
//Animal animal =new Animal(); 错误写法 不能直接创建抽象类对象!要从它的子类创建对象来调用
cat cat1=new cat();
cat1.eat(); //猫吃鱼
}`
}
1.3抽象类和抽象方法的注意事项
1.3.1作为子类继承抽象父类出现编译错误的两种情况
- 1.要么子类写成抽象类,因为子类本身就继承了父类的抽象方法,子类不是抽象类就不能编译成功抽象方法
- 2.要么子类覆盖重写抽象父类的抽象方法。(这种方式让抽象方法可以使用)
1.4抽象类的应用
题目:群主发普通红包,某群有多名成员,群主给成员发普通红包。
规则:群主的一笔金额从群主余额中扣除,平均分成N等份,让成员领取
成员领取红包后,保存到成员余额中。
请根据描述,完成案例中所有类的定义以及指定类之间的继承关系,并完成发红包的操作
//用户类 公共类
ublic class User {
private String name; //名字
private int count; //余额
private int people; //人数
public int getPeople() {
return people;
}
public void setPeople(int people) {
this.people = people;
}
public void show()
{
System.out.println("名字:"+name+" 余额:"+count);
}
public User(String name,int count){
this.name = name;
this.count=count;
this.people=people;
}
public User()
{
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//群主类
mport java.util.ArrayList;
public class Groupleader extends User {
public Groupleader(String name, int count)
{
super(name, count);
}
public Groupleader()
{
}
//发红包
public ArrayList<Integer> send(int totalMoney,int people) {
//需要一个以及集合,用来存储若干红包的金额
ArrayList<Integer> num = new ArrayList<>();
//首先设置一下群主有多少钱
super.setCount(100);
int wallet = super.getCount();
//扣钱,重新设置余额
if (wallet >= totalMoney) {
wallet -= totalMoney;
super.setCount(wallet);
} else {
System.out.println("余额不足");
return num; //钱不够就返回空集合
}
//发红包平均拆分为people份
int average = totalMoney / people;//均分
int average1=totalMoney % people;
;
// 把红包一个个放入集合当中,零头放在最后一个红包里
for (int i = 0; i < people; i++) {
if (i == people - 1) {
num.add(average1 + average);
}
else
{
num.add(average);
}
}
return num;
}
}
//成员类
import java.util.ArrayList;
import java.util.Random;
public class Members extends User{
public Members(String name, int count) {
super(name, count);
}
public Members() {
}
public void receive(ArrayList<Integer> num)
{
//从多个红包当中随便抽取一个,给我自己,删除对应的编号
int index=new Random().nextInt(num.size());//获取一个随机的索引值
//查看自己有多少钱,加钱进去
super.getCount();
super.setCount(num.get(index));
num.remove(index);
}
}
//测试类
import java.util.ArrayList;
import java.util.Random;
public class Members extends User{
public Members(String name, int count) {
super(name, count);
}
public Members() {
}
public void receive(ArrayList<Integer> num)
{
//从多个红包当中随便抽取一个,给我自己,删除对应的编号
int index=new Random().nextInt(num.size());//获取一个随机的索引值
//查看自己有多少钱,加钱进去
super.getCount();
super.setCount(num.get(index));
num.remove(index);
}
}
/*结果
名字:群主 余额:100
名字:A 余额:0
名字:B 余额:0
名字:C 余额:0
======================
名字:群主 余额:80
名字:A 余额:6
名字:B 余额:6
名字:C 余额:8*/
总结:
定义一个标准的类,全参数的构造方法,无参数的构造方法,每一个成员变量前面都加private,并且每一个变量都要定义一个getter和setter方法。
每一个方法的作用:从方法名 返回值 参数 开始拟草稿
父类的编写;从题目中找出一些公共的特点作为父类的成员变量