现实中问题引入

现实中一类具有共同特征的类,但是无法具体实现。,比如我们定义了一个几何类,叫做Shape,我们有一个方法要计算周长,直接在每个子类实现虽然可以,但是无法通过Shape定义的实例来访问到这个计算周长的方法了。

抽象类和抽象方法:

抽象类和抽象方法都必须使用abstract修饰符来定义,有抽象方法的类只能被定义成抽象类,抽象类里面可以没有抽象方法。

具体规则如下:

1)抽象类必须用abstract修饰符修饰;

2)抽象方法也必须用abstract修饰符修饰;

3)抽象方法不能有方法体

4)抽象类不能被实例化,不能用new创建实例。

5)含有抽象方法的类,只能被定义成抽象类

语法:abstract 修饰

例如:平面图形类/三角形类

  1. package com.zmd.study.abstract_example;
  2.  
  3. /**
  4. * @ClassName PlaneFigure
  5. * @projectName: object1
  6. * @author: Zhangmingda
  7. * @description: 抽象一个平面图形类,都有获取类型和周长的方法
  8. * date: 2021/3/30.
  9. */
  10. public abstract class PlaneFigure {
  11. /**
  12. * 获取平面图形的类型
  13. */
  14. public abstract String getType();
  15.  
  16. /**
  17. * 获取平面图形的周长
  18. */
  19. public abstract double getPerimeter();
  20. }

三角形类继承抽象类平面图形类

  1. package com.zmd.study.abstract_example;
  2.  
  3. /**
  4. * @ClassName Triangle
  5. * @projectName: object1
  6. * @author: Zhangmingda
  7. * @description: XXX
  8. * date: 2021/3/30.
  9. */
  10. public class Triangle extends PlaneFigure {
  11. /**
  12. * 三角形的三边长类型定义
  13. */
  14. private double a;
  15. private double b;
  16. private double c;
  17.  
  18. /**
  19. * 构造方法,创建三角形实例必须提供三边长度
  20. */
  21. public Triangle(double a, double b, double c) {
  22. /**
  23. *@params [a, b, c] 三角形三边长度
  24. *@return null
  25. *@创建时间 2021/3/30
  26. */
  27. if(a+b < c || a+c < b || b+c < a){
  28. System.out.println("Failed!:三角形的两边之和必须大于第三边");
  29. return;
  30. }
  31. this.a = a;
  32. this.b = b;
  33. this.c = c;
  34. }
  35.  
  36. @Override
  37. public String getType() {
  38. if(a+b < c || a+c < b || b+c < a){return "未知图形";}
  39. return "三角形";
  40. }
  41.  
  42. @Override
  43. public double getPerimeter() {
  44. return a + b + c;
  45. }
  46.  
  47. }

测试类

  1. package com.zmd.study.abstract_example;
  2.  
  3. public class AbstractTesst {
  4. public static void main(String[] args) {
  5. PlaneFigure planeFigure = new Triangle(3,4,5);
  6. System.out.println(planeFigure.getType());
  7. System.out.println(planeFigure.getPerimeter());
  8. }
  9. /**
  10. * 三角形
  11. * 12.0
  12. */
  13. }

抽象类的作用

抽象类只能被当成父类来继承,抽象类是从多个具体类中抽象出来的父类。。是从多个具有相同特征的类中抽象出来的一个抽象类,可以作为子类的模板,从而避免子类涉设计的随意性。

抽象类是一种模板设计思路,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展和改造。实际应用中子类总体上会大致保留抽象类的行为方式。

汽车抽象类 和具体车型类案例

目录树:

Vehicle:

  -Vehicle.java //汽车抽象类

  -Car.java

  -Bus.java

  -CarType.java  //小汽车枚举类型

  VehicleTest.java

  1. // Vehicle.java
  2.  
  3. package Vehicle;
  4.  
  5. public abstract class Vehicle {//用abstract 修饰的类叫做抽象类
  6. //用abstract 修饰的方法叫做抽象方法,没有方法体
  7. public abstract double getRent(int days);
  8. }
  1. //CarType.java
  2.  
  3. package Vehicle;
  4. /**
  5. * @author: Zhangmingda
  6. * @description:自定义车型:两箱、三箱,SUV、MPV 等,
  7. * 可以看做是一组常量的组合,类似一年只有四个季度
  8. * date: ${DATE}.
  9. */
  10. public enum CarType {
  11. HATCHBACK,THREECOMPARTMENT, SUV, MPV
  12. //分别代表两箱,三箱,SUV,MPV(商务车)
  13. }

//Car.java

  1. //Car.java
  2.  
  3. package Vehicle;
  4.  
  5. public class Car extends Vehicle{
  6. CarType type; //使用枚举类型避免出错
  7.  
  8. //重写父类的抽象方法
  9. @Override
  10. public double getRent(int days) {
  11. switch (type){
  12. case HATCHBACK://IDEA智能识别自定义的枚举可选类型
  13. return 200 * days;
  14. case THREECOMPARTMENT:
  15. return 300 *days;
  16. case SUV:
  17. return 350 * days;
  18. case MPV:
  19. return 150 * days;
  20. default:
  21. return 800 * days;
  22. }
  23. }
  24. }
  1. //Bus.java
  2.  
  3. package Vehicle;
  4.  
  5. /**
  6. * @author: Zhangmingda
  7. * @description: XXX
  8. * date: 2019/12/3.
  9. */
  10. public class Bus extends Vehicle{
  11. //大巴车定义自己的座位数属性
  12. int seats;
  13. //重写父类的抽象方法父类要求返回double类型,子类则也要求返回double
  14. @Override
  15. public double getRent(int days) {
  16. if(seats > 0 && seats <= 18){
  17. return 400 * days; //不同的座位数每日租金不同,返回计算结果不同
  18. }else if(seats > 18 && seats <= 25 ){
  19. return 1000 * days;
  20. }else if(seats > 25 && seats <= 51 ) {
  21. return 1500 * days;
  22. }else{
  23. return 2000 *days;
  24. }
  25.  
  26. }
  27. }
  1. //VehicleTest.java
  2.  
  3. package Vehicle;
  4. import java.util.Scanner;
  5. /**
  6. * @author: Zhangmingda
  7. * @description: 测试不同车的租金
  8. * date: 2019/12/3.
  9. */
  10. public class VehicleTest {
  11. public static void main(String[] args) {
  12. Scanner sc = new Scanner(System.in);
  13. //选中代码,快捷键Ctrl + Alt + T 用代码包裹
  14. while (true) {
  15. System.out.print("请输入要选择的种类:\n1 小汽车、2 Bus 7座以上汽车 3 退出:");
  16. int chose = sc.nextInt();
  17. if(chose == 1){
  18. Car car = new Car();
  19. System.out.print("请选择汽车车型:1、两箱 2、三箱 3、SUV 4、PMV(商务)");
  20. chose = sc.nextInt();
  21. //根据选择计算租金
  22. switch (chose){
  23. case 1:
  24. car.type = CarType.HATCHBACK;break;
  25. case 2:
  26. car.type = CarType.THREECOMPARTMENT;break;
  27. case 3:
  28. car.type = CarType.SUV;break;
  29. case 4:
  30. car.type = CarType.MPV;break;
  31. default:
  32. System.out.println("输入有误!以三箱做计算");
  33. car.type = CarType.THREECOMPARTMENT;
  34. break;
  35. }
  36. //车型信息确定。开始计算租金。这里定义一个单独的方法来计算,和计算bus车型共用
  37. calculate(car);
  38. }else if(chose == 2) {
  39. //确定选择bus的作为数
  40. Bus bus = new Bus();
  41. System.out.print("请选择作为数:1、18座 2、 19-25座 3、26-51座: " );
  42. chose = sc.nextInt();
  43. bus.seats = chose;
  44. //车型信息确定。开始计算租金。这里定义一个单独的方法来计算,和计算bus车型共用
  45. calculate(bus);
  46. }else {
  47. //return;
  48. System.exit(0);//退出JVM虚拟机
  49. }
  50. }
  51.  
  52. }
  53.  
  54. private static void calculate(Vehicle vehicle) {
  55. Scanner scanner = new Scanner(System.in);
  56. System.out.print("请输入要租用的天数:");
  57. int days = scanner.nextInt();
  58. System.out.println("您的租金为:" + vehicle.getRent(days) );
  59.  
  60. }
  61. }
  1. //模拟计算机USB接口应用
  2. //目录usb
  3. // Computer.java 计算机类
  4. // Disk.java 磁盘类实现USB接口
  5. // Printer.java 打印机类 实现USB接口
  6. // Usb.java 接口规范
  7. // 接口
  1. package usb;
  2.  
  3. /**
  4. * @author: Zhangmingda
  5. * @description: 定义一个接口,供任何USB设备相互对接
  6. * date: 2019/12/3.
  7. */
  8. public interface Usb {
  9. void connect();
  10. void disconnect();
  11. }
  1.  
  1. package usb;
  2.  
  3. /**
  4. * @author: Zhangmingda
  5. * @description: XXX
  6. * date: 2019/12/3.
  7. */
  8. public class Printer implements Usb {
  9. @Override
  10. public void connect() {
  11. System.out.println("打印机已连接。");
  12. }
  13.  
  14. @Override
  15. public void disconnect() {
  16. System.out.println("打印机已断开连接,可以拔出了!");
  17. }
  18. }
  1. package usb;
  2.  
  3. /**
  4. * @author: Zhangmingda
  5. * @description: XXX
  6. * date: 2019/12/3.
  7. */
  8. public class Disk implements Usb {
  9. @Override
  10. public void connect() {
  11. System.out.println("硬盘已连接。");
  12. }
  13.  
  14. @Override
  15. public void disconnect() {
  16. System.out.println("硬盘已断开连接,可以拔出了!");
  17. }
  18. }
  1. package usb;
  2.  
  3. /**
  4. * @author: Zhangmingda
  5. * @description: 定义计算机可以插入USB设备、移除USB设备功能
  6. * date: 2019/12/3.
  7. */
  8. public class Computer {
  9. Usb slot; //定义Usb 插槽,类变量
  10. //把USB设备插入USB卡槽,需要通过参数接收一个USB设备,实现了一个USB接口就行
  11. public void insert( Usb device){
  12. slot = device;//通过赋值模拟设备插在USB口中
  13. slot.connect();//插上就自动连接
  14. }
  15. public void pullout(Usb device){
  16. if(this.slot == null){
  17. System.out.println("USB口没有设备");
  18. return;
  19. }
  20. device.disconnect();
  21. this.slot = null;
  22. System.out.println("设备已拔出");
  23. }
  24. }
  1. package usb;
  2.  
  3. /**
  4. * @author: Zhangmingda
  5. * @description: 测试计算机插拔 实现接口的设备
  6. * date: 2019/12/3.
  7. */
  8. public class ComputerTest {
  9. public static void main(String[] args) {
  10. //建立一个计算机对象、磁盘、打印机
  11. Computer computer = new Computer();
  12. Disk disk = new Disk();
  13. Printer printer = new Printer();
  14. //模拟插入拔出操作
  15. computer.insert(disk);
  16. computer.pullout(disk);
  17. computer.insert(printer);
  18. computer.pullout(printer);
  19. computer.pullout(printer);
  20.  
  21. }
  22. }
  1.  

java 、abstract修饰的【抽象类】【比如几何图形类】的更多相关文章

  1. java 接口 继承 接口 抽象类 继承 实体类

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 接口 可以 继承 接口 抽象类 可以 实现 接口 抽象类 继承实体类 需要 实体类 有 ...

  2. Java的修饰符

    转自:http://blog.csdn.net/manyizilin/article/details/51926230#L42 修饰符: 像其他语言一样,Java可以使用修饰符来修饰类中方法和属性.主 ...

  3. 十、Java基础---------面向对象之抽象类与接口

    抽象类(abstract)     当编写一个类时,时常会为该类定义一些方法,这些方法的使用用以描述该类的行为方式,那么这些方法都有具体的方法体.但是在某些情况下,某个父类只是知道子类应该包含怎样的方 ...

  4. Java中多态、抽象类和接口

    1:final关键字(掌握) (1)是最终的意思,可以修饰类,方法,变量. (2)特点: A:它修饰的类,不能被继承. B:它修饰的方法,不能被重写. C:它修饰的变量,是一个常量. (3)面试相关: ...

  5. JAVA中接口与抽象类

    抽象类总结 抽象类的概念:是使用关键字abstract修饰的类就是抽象类: 抽象类的产生:当多个不能相互继承的类具有相同的功能时,就需要将共同的信息向上抽取,放到公共的父类中:如果公共的父类只能描述所 ...

  6. Java中的继承抽象类和接口

    一.总结 1.使用extends关键字继承,eg: class Student extends Persion { ...}; 2.Java编程规范中类的首字母大写,方法的首字母小写单词首字母代谢,e ...

  7. Java 5- Java 修饰符

    Java 修饰符 Java语言提供了很多修饰符,主要分为以下两类: 访问修饰符 非访问修饰符 修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: public class ...

  8. abstract修饰符

    abstract(C# 参考) abstract 修饰符指示所修饰的内容缺少实现或未完全实现. abstract 修饰符可用于类.方法.属性.索引器和事件. 在类声明中使用 abstract 修饰符以 ...

  9. Java中接口和抽象类的区别?

    抽象类 抽象类必须用 abstract 修饰,子类必须实现抽象类中的抽象方法,如果有未实现的,那么子类也必须用 abstract 修饰.抽象类默认的权限修饰符为 public,可以定义为 public ...

  10. 【Java】接口和抽象类总结

    一.接口 1.1 成员变量(其实是常量) 1.2 方法 二.抽象类 2.1 成员变量 2.2 方法 一.接口 1.1 成员变量(其实是常量) 成员变量默认用 public static final修饰 ...

随机推荐

  1. JDK中Lambda表达式的序列化与SerializedLambda的巧妙使用

    前提 笔者在下班空余时间想以Javassist为核心基于JDBC写一套摒弃反射调用的轻量级的ORM框架,过程中有研读mybatis.tk-mapper.mybatis-plus和spring-boot ...

  2. CF1368E Ski Accidents

    读懂题是第一要素. 考虑把点集分割为:\(A,B,C\) 首先把所有入度为\(0\)的点加入\(A\) 然后对所有入边只来自\(A\)的点加入\(B\) 然后对所有入边只来自\(B\)的点加入\(C\ ...

  3. mac 下 如何在同一窗口打开多个终端并实现快捷键切换

    相信大家编代码的时候都会遇到,每次需要在头文件,库文件和源码文件中编代码的时候,总是需要在几个文件中切换来切换去的,而且一个文件就一个终端窗口,每次都要用鼠标点来点去,非常麻烦,所以如果能把这几个文件 ...

  4. Markdown-写作必备

    Markdown--入门指南 导语: Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」.「语言」所迷惑,Markdow ...

  5. Java项目发现==顺手改成equals之后,会发生什么?

    最近发生一件很尴尬的事情,在维护一个 Java 项目的时候,发现有使用 == 来比较两个对象的属性, 于是顺手就把 == 改成了 equals.悲剧发生...... == 和 equals 的区别 = ...

  6. JavaScript中var与let的异同点

    var是JavaScript刚出现时就存在的变量声明关键字,而let作为ES6才出现的变量声明关键字,无疑两者之间存在着很大的区别.那么具体有哪些区别呢? 1.作用域表现形式不同,var是函数作用域, ...

  7. day03 部署NFS服务

    day03 部署NFS服务 NFS的原理 1.什么是NFS 共享网络文件存储服务器 2.NFS的原理 1.用户访问NFS客户端,将请求转化为函数 2.NFS通过TCP/IP连接服务端 3.NFS服务端 ...

  8. Sharding-JDBC 实现水平分表

    1.搭建环 (1) 技术: SpringBoot2.2.1+ MyBatisPlus + Sharding-JDBC + Druid 连接池(2)创建 SpringBoot 工程

  9. Web安全学习二

    目录 常见漏洞攻防 SQL注入 注入分类 按技巧分类 按获取数据的方式分类 注入检测 权限提升 数据库检测 绕过技巧 CheatSheet SQL Server Payload MySQL Paylo ...

  10. 100个Shell脚本——【脚本9】统计ip

    [脚本9]统计ip 有一个日志文件,日志片段:如下: 112.111.12.248 – [25/Sep/2013:16:08:31 +0800]formula-x.haotui.com "/ ...