抽象类

概述

  父类中的方法,被其子类重写,子类各自的实现不尽相同。那么父类的方法声明和方法主体,只有声明还有意义,方法主体则没有存在的意义了。

java void 方法不加Transactional java中没有方法体的方法_抽象类

 

 

没有方法主体的方法称为抽象方法。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.分析:

  

java void 方法不加Transactional java中没有方法体的方法_父类_02

 

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