##抽象类##

- 概述

在继承和多态时,讲到了父类的方法多数时候,是要被子类们重写,且各自的实现不尽相同。那么对于父类来说,其方法声明还有用,方法体就没用了,这样在父类中,就只保留方法的声明和空的方法体。这种没有方法体的方法称为抽象方法。java语言规定,包含抽象方法的类就是抽象类。

- abstract关键字

使用abstract关键字修饰抽象类以及抽象方法,例如:

public abstract class Animal {

public abstract void run();

}

- 抽象类的使用规定

继承抽象类的子类必须重写父类所有的抽象方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该父

类的抽象方法,否则,从最初的父类到最终的子类都不能创建对象,失去意义。

1. 抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象。

2. 抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的。

3. 抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。

4. 抽象类的子类,必须重写抽象父类中所有的抽象方法,否则,编译无法通过而报错。除非该子类也是抽象类。

这些也好理解,首先定义抽象类,目的就是不想让创建该类对象,只需要对子类创建对象即可,而子类在创建对象的时候,要先初始化父类,所以抽象类是可以有构造方法的,子类是可以生成对象的,所以就不能包含抽象方法,所以类中要对父类的抽象方法全部进行重写覆盖。

# 继承的综合案例 #

- 需求分析:

群主发普通红包。某群有多名成员,群主给成员发普通红包。普通红包的规则:

1. 群主的一笔金额,从群主余额中扣除,平均分成n等份,让成员领取。

2. 成员领取红包后,保存到成员余额中。

请根据描述,完成案例中所有类的定义以及指定类之间的继承关系,并完成发红包的操作。

-案例分析

一个父类user,两个成员变量username与money,一个成员方法show;子类一群主,自定义方法发红包;子类二成员类,自定义方法收红包;

-案例实现

定义用户类

public class User{private String suername;private double money;public User(){}public User(String username,double money){this.username = username;this.money = money;}public String getUsername(){return username;}public String setUsername(String username){this.username = username;}public String getMoney(){return money;}public String setMoney(double money){this.money = money;}public void show(){System.out,println("用户名:"+username+",余额为:"+money+"元");}
}

定义群主类

public class QunZhu extenmds User{public QunZhu(){}public QunZhu(String username,double money){super(username, leftMoney);}/*
群主发红包,就是把一个整数的金额,分层若干等份。
1.获取群主余额,是否够发红包.
不能则返回null,并提示.
能则继续.
2.修改群主余额.
3.拆分红包.
3.1.如果能整除,那么就平均分。
3.2.如果不能整除,那么就把余数分给最后一份。
*/
public ArrayList<Double> send(jint money,int count){double leftMoney = getMoney();if(money>leftMoney){return null;}setMoney(leftMoney - money);ArrayList<Double> list = new ArrayList<>();money = money * 100;// 每份的金额int m = money / count;// 不能整除的余数int l = money % count;// 无论是否整除,n‐1份,都是每份的等额金额  for(inti=0;i<count‐1;i++){// 缩小100倍,折算成 '元'  list.add(m/100.0);}// 判断是否整除  if(l==0){// 能整除, 最后一份金额,与之前每份金额一致  list.add(m/100.0);}else{// 不能整除, 最后一份的金额,是之前每份金额+余数金额  list.add((m+l)/100.00);}// 返回集合  return list;}
}

定义成员类

public class Member extends User {public Member() {}public Member(String username, double leftMoney) {super(username, leftMoney);}// 打开红包,就是从集合中,随机取出一份,保存到自己的余额中public void openHongbao(ArrayList<Double> list) {// 创建Random对象  Random r = new Random();  // 随机生成一个角标  int index = r.nextInt(list.size());  // 移除一个金额Double money = list.remove(index);// 直接调用父类方法,设置到余额  setMoney(money);}
}

定义测试类:

public class Test {public static void main(String[] args) {// 创建一个群主对象QunZhu qz = new QunZhu("群主" , 200);// 创建一个键盘录入  Scanner sc = new Scanner();  System.out.println("请输入金额:");int money = sc.nextInt();System.out.println("请输入个数:");int count = sc.nextInt();// 发送红包   ArrayList<Double> sendList = qz.send(money,count);// 判断,如果余额不足if(sendList == null){System.out.println(" 余额不足...");return;}// 创建三个成员Member m = new Member();Member m2 = new Member();Member m3 = new Member();// 打开红包  m.openHongbao(sendList);m2.openHongbao(sendList);m3.openHongbao(sendList);
// 展示信息        qz.show();m.show();m2.show();m3.show();}
}

抽象类可以创建对象吗_【基础篇】java-抽象类与继承的补充相关推荐

  1. java抽象类的属性_深入理解Java抽象类

    基础部分内容差不多讲解完了,今天开始进入Java提高篇部分,这部分内容会比之前的内容复杂很多,希望大家做好心理准备,看不懂的部分可以多看两遍,仍不理解的部分那一定是我讲的不够生动,记得留言提醒我. 好 ...

  2. Lunx运维监控_shark巨菜_基础篇

    Lunx运维监控_shark巨菜_基础篇 一.监控重要性 单单从"监控"两个字来谈,范围之广可以涵盖我们生活的方方面面,我们生活和工作中处处可见视频监控的摄像机:机房中的电压电流监 ...

  3. C++基础篇之抽象类的接口

    C++基础篇之抽象类的接口 接口描述了类的行为和功能,而不需要完成类的特定实现. C++ 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念. 如果类 ...

  4. Oracle、Mysql数据库编程开发基本操作命令语法脚本_基础篇(入门级)

    Oracle.Mysql数据库开发基本操作命令语法脚本_基础篇(入门级) 文章目录 Oracle.Mysql数据库开发基本操作命令语法脚本_基础篇(入门级) 一.数据库中常用的字段类型 二.操作数据库 ...

  5. Java基础篇--Java 数组

    Java基础篇--Java 数组 Java 数组 声明数组变量 创建数组 处理数组 For-Each 循环 数组作为函数的参数 数组作为函数的返回值 多维数组 多维数组的动态初始化(以二维数组为例) ...

  6. JavaSE基础篇--Java SE语法02--基本语法

    JavaSE基础篇 Java SE语法02 HelloWorld 基本语法 流程控制 方法 数组 基本语法 标识符 关键字 数据类型 运算符 数据类型转换 运算后结果的数据类型 Java SE语法02 ...

  7. 东华大学2020考研计算机复试准备上机题解析答案_基础篇 前言

    东华2020考研复试准备上机题解析答案_基础篇 前言 大家好,我是今年参加东华大学研究生入学考试的学生,前不久东华大学发布了关于复试上机的通知,还有题库供大家练习.我于是刷完了所有的题目,并且把题目和 ...

  8. 疯狂的大柚柚带你玩转MSP-ESP430G2(基础篇)-----(八)低功耗模式补充

    疯狂的大柚柚带你玩转MSP-ESP430G2(基础篇) (八)低功耗模式补充 如果MSP430处于低功耗模式的工作状态,当可屏蔽中断和非可屏蔽中断源产生时,就会唤醒CPU进入中断处理程序. 入栈保护当 ...

  9. Java综合知识总结_基础篇

    Java 一.JDK常用的包 java.lang: 这个是系统的基础类,比如String.Math.Integer.System和Thread, 提供常用功能. java.io: 这里面是所有输入输出 ...

最新文章

  1. 混合粒子群算法原理通俗讲解
  2. 爬虫学习笔记(二十三)—— Appium+Mitmproxy
  3. 为什么一定要好好睡觉?
  4. IIC总线的原理与Verilog实现
  5. JavaScript实现clearBit清除位算法(附完整源码)
  6. Pandas与openpyxl库的 完美 融合!
  7. 正则表达式及测试工具
  8. HTTP劫持 方面了解和学习
  9. nodewebkitV0.21.6版本的学习
  10. Python基本数据类型之字典
  11. 计算机组成原理第一章练习题(答案详解)
  12. java爬虫 抓取国家统计局:统计用区划代码和城乡划分代码(抓取省市区镇县办事处村委会数据)生成json
  13. 软件集成测试分析,软件集成测试报告模板
  14. 关于LIS系统与HIS系统的接口方案
  15. 变邻域搜索(VNS)原理梳理和应用细节-附求解VRPTW问题C++代码
  16. OpenStack 运维 - 环境部署 | 报错排查 [T版]
  17. python3报错: takes 1 positional argument but 2 were given 问题解决。
  18. 可长时间佩戴的耳机真的存在吗?骨传导耳机是否对耳朵伤害更小?
  19. 关于c++中的一个母牛生小牛的问题详细解答与体会
  20. PostgreSQL分区

热门文章

  1. 关于CRM AET table extension是否能够在S4CRM继续使用的问题
  2. 如何使用Angular的@Input()装饰器
  3. build.gradle里repositories的mavenCentral实现原理解析
  4. SAP C4C - the entity BO node XXXX is unknown
  5. 在SAP C4C TI(Thing Inspector)页面里添加自定义UI
  6. SAP UI5 busy Dialog debug
  7. 为什么我开发的SAP UI5应用里的group by 功能不工作?
  8. why I cannot set SAP UI5 dropdown list as not selected
  9. SAP Material type mapping
  10. UI5 setBusyIndicatorDelay