抽象类---相关操作

抽象类—相关操作

  1. 抽象类定义和使用

    • Animal抽象类

      package cn.xiaoge.day09.demo11;
      
      /*
      抽象方法: 就是加上abstract关键字, 然后去掉大括号, 直接分号结束.
      抽象类: 抽象方法所在的类, 必须是抽象类才行.在class之前写上abstract即可.
      
      如何使用抽象类和抽象方法:
      1. 不能直接创建new抽象类对象.
      2. 必须用一个子类来继承抽象父类.
      3. 子类必须覆盖重写抽象父类当中所有的抽象方法.
      覆盖重写(实现):去掉抽象方法的abstract关键字, 然后补上方法体大括号.
      4. 创建子类对象进行使用.
       */
      
      public abstract class Animal {
      
          // 这就是一个抽象方法, 代表吃东西, 但是具体吃什么(大括号的内容)不确定.
          public abstract void eat();
      
          // 这是普通的成员方法
          // public void normalMethod() {
      
          // }
      
      }
      
    • Cat类

      package cn.xiaoge.day09.demo11;
      
      public class Cat extends Animal {
      
          @Override
          public void eat() {
              System.out.println("猫吃鱼");
          }
      
      }
      
    • 执行路口

      package cn.xiaoge.day09.demo11;
      
      public class DemoMain {
      
          public static void main(String[] args) {
              // Animal animal = new Animal(); // 错误写法! 不能直接创建抽象类
      
              Cat cat = new Cat();
      
              cat.eat();
      
          }
      
      }
      
      // 运行结果
      猫吃鱼
      
  2. 抽象类案例

    • MyAbstract抽象类

      package cn.xiaoge.day09.demo12;
      
      /*
      一个抽象类不一定含有抽象方法.
      只要保证抽象方法所在的类是抽象类, 即可.
      
      这样没有抽象方法的抽象类, 也不能直接创建对象, 在一些特殊场景下有用途.
       */
      
      public abstract class MyAbstract {
      }
      
      
    • Fu类

      package cn.xiaoge.day09.demo12;
      
      public abstract class Fu {
      
          public Fu(){
              System.out.println("抽象父类构造方法执行");
          }
      
          public abstract void eat();
      
      }
      
      
    • Zi类

      package cn.xiaoge.day09.demo12;
      
      public class Zi extends Fu {
      
          public Zi(){
              System.out.println("子类构造方法执行");
          }
      
          @Override
          public void eat() {
              System.out.println("吃饭饭");
          }
      }
      
    • 执行路口

      package cn.xiaoge.day09.demo12;
      
      public class DemoMain {
          public static void main(String[] args) {
              Zi zi = new Zi();
              zi.eat();
          }
      }
      
      // 运行结果
      抽象父类构造方法执行
      子类构造方法执行
      吃饭饭
      
  3. 抽象类案例

    • Animal类

      package cn.xiaoge.day09.demo13;
      
      // 最高的抽象父类
      public abstract class Animal {
      
          public abstract void eat();
      
          public abstract void sleep();
      
      }
      
      
    • Dog类

      package cn.xiaoge.day09.demo13;
      
      // 子类也是抽象类
      public abstract class Dog extends Animal {
      
          @Override
          public void eat() {
              System.out.println("狗吃骨头");
          }
      
          // @Override
          // public void sleep() {
          //     System.out.println("狗睡觉");
          // }
      
      }
      
      
    • Dog2Ha类

      package cn.xiaoge.day09.demo13;
      
      public class Dog2Ha extends Dog {
          @Override
          public void sleep() {
              System.out.println("嘿嘿嘿...");
          }
      }
      
    • DogGolden类

      package cn.xiaoge.day09.demo13;
      
      public class DogGolden extends Dog {
      
          @Override
          public void sleep() {
              System.out.println("呼呼呼呼...");
          }
      
      }
      
    • 执行路口

      package cn.xiaoge.day09.demo13;
      
      public class DemoMain {
      
          public static void main(String[] args) {
      
              // Animal animal = new Animal(); // 错误  Animal抽象类
      
              // Dog animal = new Dog(); // 错误  Dog抽象类
      
              Dog2Ha dog2Ha = new Dog2Ha();   // 这是普通类, 可以直接new对象.
              dog2Ha.eat();
              dog2Ha.sleep();
      
              System.out.println("=====================");
      
              DogGolden dogGolden = new DogGolden();
              dogGolden.eat();
              dogGolden.sleep();
          }
      
      }
      
      // 运行结果
      狗吃骨头
      嘿嘿嘿...
      =====================
      狗吃骨头
      呼呼呼呼...
      
  4. 发红包案例

    • User类

      package cn.xiaoge.day09.demo14;
      
      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("我叫:" + this.name + ", 我有" + this.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;
          }
      }
      
    • GroupManager类

      package cn.xiaoge.day09.demo14;
      
      import java.util.ArrayList;
      
      public class GroupManager extends User {
      
          public GroupManager() {
      
          }
      
          public GroupManager(String name, int money) {
              super(name, money);  // 调用父类的构造方法
          }
      
          public ArrayList<Integer> send(int totalMoney, int count) {
              // 需要一个集合, 用来存储若干个红包金额
              ArrayList<Integer> redList = new ArrayList<>();
      
              // 首先看一下群主有多少钱
              int leftMoney = super.getMoney();   // 群主当前余额
      
              // 判断群主的余额够不够发这次红包
              if (totalMoney > leftMoney){
                  System.out.println("余额不足请及时充值");
                  return redList;
              }
      
              // 扣钱, 启示就是重新设置余额
              leftMoney -= totalMoney;
              super.setMoney(leftMoney);
      
              // 发红包需要平均拆分成为count份
              int avg = totalMoney / count;
              int mod = totalMoney % count;   // 余数, 也就是甩下的零头
      
              // 除不开的零头, 包在最后一个红包当中
              // 下面把红包一个一个放在集合当中
              for (int i = 0; i < count; i++) {
                  if (count - 1 == i) {
                      redList.add(avg + mod);
                  } else {
                      redList.add(avg);
                  }
              }
      
              return redList;
          }
      
      }
      
    • GroupMembers类

      package cn.xiaoge.day09.demo14;
      
      import java.util.ArrayList;
      import java.util.Random;
      
      public class GroupMembers extends User {
      
          public GroupMembers() {
      
          }
      
          public GroupMembers(String name, int money) {
              super(name, money);
          }
      
          public void receive(ArrayList<Integer> list) {
              // 从多个红包当中随便抽取一个, 给我自己.
              // 随机后去一个集合当中的索引编号
              int index = new Random().nextInt(list.size());
      
              // 根据索引, 从集合当中删除, 并且得到被删除的红包, 给我自己
              int delta = list.remove(index);
              // 加法
              delta += super.getMoney();
      
              // 重写设置回去
              super.setMoney(delta);
          }
      }
      
    • 执行路口

      package cn.xiaoge.day09.demo14;
      
      import java.util.ArrayList;
      
      public class Demo01SendEnvelope {
      
          public static void main(String[] args) {
              GroupManager manager = new GroupManager("柳岩", 1000);
              manager.show();
              ArrayList<Integer> redList = manager.send(200, 3);
              manager.show();
      
              System.out.println("==========================");
      
              GroupMembers member1 = new GroupMembers("权志龙1", 1000);
              GroupMembers member2 = new GroupMembers("权志龙2", 1000);
              GroupMembers member3 = new GroupMembers("权志龙2", 1000);
              member1.receive(redList);
              member2.receive(redList);
              member3.receive(redList);
              member1.show();
              member2.show();
              member3.show();
          }
      
      }
      
      // 运行结果
      我叫:柳岩, 我有1000钱
      我叫:柳岩, 我有800==========================
      我叫:权志龙1, 我有1066钱
      我叫:权志龙2, 我有1066钱
      我叫:权志龙2, 我有1068
发布了275 篇原创文章 · 获赞 89 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/zsx1314lovezyf/article/details/102745562