抽象类
概述
父类中的方法,被其子类重写,子类各自的实现不尽相同。那么父类的方法声明和方法主体,只有声明还有意义,方法主体则没有存在的意义了。
没有方法主体的方法称为抽象方法。java语法规定,包含抽象方法的类就是抽象类。
定义
抽象方法:没有方法体的方法
抽象类:含抽象方法的类
使用格式——abstract(修饰)
使用abstract关键字修饰方法,该方法就成了抽象方法,抽象方法只包含方法名,没有方法体。
1.格式
修饰符 abstract 返回值类型 方法名(参数列表);
public abstract void run();
2.注意事项
抽象方法:加上abstract关键字修饰,去掉大括号,直接分号结束。
public abstract void eat();
抽象类:抽象方法所在的类,必须是抽象类才行。在class前加上abstract关键字修饰。
3.如何使用
1.不能直接创建抽象对象(不能直接new抽象对象)
2.必须创建子类,继承抽象类父类
3.子类必须重写父类中的抽象方法
4.创建子类对象进行使用
add:子类对父类的抽象方法覆盖重写,去掉抽象方法的abstract关键字,然后补上方法体大括号;
抽象的使用
package day07.demo01.demo10;
//抽象类
public abstract class Animal {
//定义动物的抽象方法——吃(吃什么不能确定)
public abstract void eat();
//定义普通的成员方法
public void method(){
System.out.println("父类普通的成员方法(抽象类中普通的成员方法)");
}
}
Animal(父类)
package day07.demo01.demo10;
public class Cat extends Animal {
@Override
//对父类的抽象方法进行重写
public void eat() {
//实现抽象类
System.out.println("猫:我吃鱼");
}
}
Cat(子类)
package day07.demo01.demo10;
public class Dog extends Animal {
@Override
//对父类中的抽象方法进行重写
public void eat() {
System.out.println("狗:我爱吃骨头");
}
}
Dog(子类)
package day07.demo01.demo10;
public class demo {
public static void main(String[] args) {
// Animal animal = new Animal() 错误写法
Cat cat = new Cat();
cat.eat();
Dog dog = new Dog();
dog.eat();
}
}
mian
注意:Animal animal = new Animal() //错误写法,直接new抽象类是错误的
继承的综合案例
综合案例:群主发普通红包
1.规则:
1.群主的一笔金额,从群主的余额扣除,平均分成n等分,让成员领取
2.成员领取红包后,保存到成员余额中。
2.分析:
package day07.demo01.demo11;
import javax.print.DocFlavor;
public class User {
//成员变量
private String name; //用户名
private double leftMoney; //余额
//构造方法
public User(){};
public User(String name,double leftMoney){
this.name = name;
this.leftMoney = leftMoney;
}
//定义get and set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getLeftMoney() {
return leftMoney;
}
public void setLeftMoney(double leftMoney) {
this.leftMoney = leftMoney;
}
//定义显示信息
public void show(){
System.out.println("用户名:"+name+",当前余额为:"+leftMoney);
}
}
User---父类
package day07.demo01.demo11;
import java.util.ArrayList;
public class qunZhu extends User{
//添加构造方法
public qunZhu(){};
//谈过super父类的构造方法父类的构造方法
public qunZhu(String name,double leftMoney){
super(name, leftMoney);
}
public ArrayList<Double> faHongbao(double money,int count){
//获取群主余额
double leftMoney = getLeftMoney();
//如果发的钱大于余额 则返回null
if(money > leftMoney){
return null;
}
//群主余额 = 余额 - 发出去的钱
this.setLeftMoney(leftMoney-money);
//创建集合 保存等分金额
ArrayList<Double> list = new ArrayList<>();
//扩大100倍 相当于折算成“分”为单位
money = money *100;
//每份金额 = 总额 /总人数
double m = money/count;
//不能整除的数
double l = money %count;
//无论是否整除,n-1份,都是每份的等额金额 发一个人 减少一个人
for (int i = 0; i <= count - 1; i++) {
//缩小100倍折算成“元”
if(l == 0){
list.add(m/100.0);
}else {
list.add((m+1)/100.0);
}
}
return list;
}
}
qunZhu---子类
package day07.demo01.demo11;
import java.util.ArrayList;
import java.util.Random;
public class chengYuan extends User{
public chengYuan(){};
public chengYuan(String username,double leftMoney){
super(username,leftMoney);
}
//打开红包 从集合随机获取一份 保存到自己余额
public void openHongbao(ArrayList<Double> list){
Random r = new Random();
int index = r.nextInt(list.size());
//移除一个 金额
double money = list.get(index);
list.remove(index);
//直接调用父类方法 设置到金额.
setLeftMoney(money);
}
}
chengYuan---子类
package day07.demo01.demo11;
import java.util.ArrayList;
import java.util.Scanner;
public class demo {
public static void main(String[] args) {
//创建群主 初始name 金额
qunZhu qunzhu = new qunZhu("群主",300);
//创建键盘录入红包数值和红包个数
Scanner sc = new Scanner(System.in);
System.out.print("请输入红包金额:");
double money = sc.nextDouble();
System.out.print("请输入红包数:");
int num = sc.nextInt();
//发红包
ArrayList<Double> sendList = qunzhu.faHongbao(25.5,3);
//判断余额
if(sendList == null){
System.out.println("余额不足");
return;
}
//创建三个成员变量
chengYuan cy1 = new chengYuan("张三",0.00);
chengYuan cy2 = new chengYuan("李四",0.50);
chengYuan cy3 = new chengYuan("王五",1.00);
//打开红包
cy1.openHongbao(sendList);
cy2.openHongbao(sendList);
cy3.openHongbao(sendList);
//展示信息
qunzhu.show();
cy1.show();
cy2.show();
cy3.show();
}
}
mian