java 、abstract修饰的【抽象类】【比如几何图形类】
现实中问题引入
现实中一类具有共同特征的类,但是无法具体实现。,比如我们定义了一个几何类,叫做Shape,我们有一个方法要计算周长,直接在每个子类实现虽然可以,但是无法通过Shape定义的实例来访问到这个计算周长的方法了。
抽象类和抽象方法:
抽象类和抽象方法都必须使用abstract修饰符来定义,有抽象方法的类只能被定义成抽象类,抽象类里面可以没有抽象方法。
具体规则如下:
1)抽象类必须用abstract修饰符修饰;
2)抽象方法也必须用abstract修饰符修饰;
3)抽象方法不能有方法体
4)抽象类不能被实例化,不能用new创建实例。
5)含有抽象方法的类,只能被定义成抽象类
语法:abstract 修饰
例如:平面图形类/三角形类
- package com.zmd.study.abstract_example;
- /**
- * @ClassName PlaneFigure
- * @projectName: object1
- * @author: Zhangmingda
- * @description: 抽象一个平面图形类,都有获取类型和周长的方法
- * date: 2021/3/30.
- */
- public abstract class PlaneFigure {
- /**
- * 获取平面图形的类型
- */
- public abstract String getType();
- /**
- * 获取平面图形的周长
- */
- public abstract double getPerimeter();
- }
三角形类继承抽象类平面图形类
- package com.zmd.study.abstract_example;
- /**
- * @ClassName Triangle
- * @projectName: object1
- * @author: Zhangmingda
- * @description: XXX
- * date: 2021/3/30.
- */
- public class Triangle extends PlaneFigure {
- /**
- * 三角形的三边长类型定义
- */
- private double a;
- private double b;
- private double c;
- /**
- * 构造方法,创建三角形实例必须提供三边长度
- */
- public Triangle(double a, double b, double c) {
- /**
- *@params [a, b, c] 三角形三边长度
- *@return null
- *@创建时间 2021/3/30
- */
- if(a+b < c || a+c < b || b+c < a){
- System.out.println("Failed!:三角形的两边之和必须大于第三边");
- return;
- }
- this.a = a;
- this.b = b;
- this.c = c;
- }
- @Override
- public String getType() {
- if(a+b < c || a+c < b || b+c < a){return "未知图形";}
- return "三角形";
- }
- @Override
- public double getPerimeter() {
- return a + b + c;
- }
- }
测试类
- package com.zmd.study.abstract_example;
- public class AbstractTesst {
- public static void main(String[] args) {
- PlaneFigure planeFigure = new Triangle(3,4,5);
- System.out.println(planeFigure.getType());
- System.out.println(planeFigure.getPerimeter());
- }
- /**
- * 三角形
- * 12.0
- */
- }
抽象类的作用
抽象类只能被当成父类来继承,抽象类是从多个具体类中抽象出来的父类。。是从多个具有相同特征的类中抽象出来的一个抽象类,可以作为子类的模板,从而避免子类涉设计的随意性。
抽象类是一种模板设计思路,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展和改造。实际应用中子类总体上会大致保留抽象类的行为方式。
汽车抽象类 和具体车型类案例
目录树:
Vehicle:
-Vehicle.java //汽车抽象类
-Car.java
-Bus.java
-CarType.java //小汽车枚举类型
VehicleTest.java
- // Vehicle.java
- package Vehicle;
- public abstract class Vehicle {//用abstract 修饰的类叫做抽象类
- //用abstract 修饰的方法叫做抽象方法,没有方法体
- public abstract double getRent(int days);
- }
- //CarType.java
- package Vehicle;
- /**
- * @author: Zhangmingda
- * @description:自定义车型:两箱、三箱,SUV、MPV 等,
- * 可以看做是一组常量的组合,类似一年只有四个季度
- * date: ${DATE}.
- */
- public enum CarType {
- HATCHBACK,THREECOMPARTMENT, SUV, MPV
- //分别代表两箱,三箱,SUV,MPV(商务车)
- }
//Car.java
- //Car.java
- package Vehicle;
- public class Car extends Vehicle{
- CarType type; //使用枚举类型避免出错
- //重写父类的抽象方法
- @Override
- public double getRent(int days) {
- switch (type){
- case HATCHBACK://IDEA智能识别自定义的枚举可选类型
- return 200 * days;
- case THREECOMPARTMENT:
- return 300 *days;
- case SUV:
- return 350 * days;
- case MPV:
- return 150 * days;
- default:
- return 800 * days;
- }
- }
- }
- //Bus.java
- package Vehicle;
- /**
- * @author: Zhangmingda
- * @description: XXX
- * date: 2019/12/3.
- */
- public class Bus extends Vehicle{
- //大巴车定义自己的座位数属性
- int seats;
- //重写父类的抽象方法父类要求返回double类型,子类则也要求返回double
- @Override
- public double getRent(int days) {
- if(seats > 0 && seats <= 18){
- return 400 * days; //不同的座位数每日租金不同,返回计算结果不同
- }else if(seats > 18 && seats <= 25 ){
- return 1000 * days;
- }else if(seats > 25 && seats <= 51 ) {
- return 1500 * days;
- }else{
- return 2000 *days;
- }
- }
- }
- //VehicleTest.java
- package Vehicle;
- import java.util.Scanner;
- /**
- * @author: Zhangmingda
- * @description: 测试不同车的租金
- * date: 2019/12/3.
- */
- public class VehicleTest {
- public static void main(String[] args) {
- Scanner sc = new Scanner(System.in);
- //选中代码,快捷键Ctrl + Alt + T 用代码包裹
- while (true) {
- System.out.print("请输入要选择的种类:\n1 小汽车、2 Bus 7座以上汽车 3 退出:");
- int chose = sc.nextInt();
- if(chose == 1){
- Car car = new Car();
- System.out.print("请选择汽车车型:1、两箱 2、三箱 3、SUV 4、PMV(商务)");
- chose = sc.nextInt();
- //根据选择计算租金
- switch (chose){
- case 1:
- car.type = CarType.HATCHBACK;break;
- case 2:
- car.type = CarType.THREECOMPARTMENT;break;
- case 3:
- car.type = CarType.SUV;break;
- case 4:
- car.type = CarType.MPV;break;
- default:
- System.out.println("输入有误!以三箱做计算");
- car.type = CarType.THREECOMPARTMENT;
- break;
- }
- //车型信息确定。开始计算租金。这里定义一个单独的方法来计算,和计算bus车型共用
- calculate(car);
- }else if(chose == 2) {
- //确定选择bus的作为数
- Bus bus = new Bus();
- System.out.print("请选择作为数:1、18座 2、 19-25座 3、26-51座: " );
- chose = sc.nextInt();
- bus.seats = chose;
- //车型信息确定。开始计算租金。这里定义一个单独的方法来计算,和计算bus车型共用
- calculate(bus);
- }else {
- //return;
- System.exit(0);//退出JVM虚拟机
- }
- }
- }
- private static void calculate(Vehicle vehicle) {
- Scanner scanner = new Scanner(System.in);
- System.out.print("请输入要租用的天数:");
- int days = scanner.nextInt();
- System.out.println("您的租金为:" + vehicle.getRent(days) );
- }
- }
- //模拟计算机USB接口应用
- //目录usb
- // Computer.java 计算机类
- // Disk.java 磁盘类实现USB接口
- // Printer.java 打印机类 实现USB接口
- // Usb.java 接口规范
- // 接口
- package usb;
- /**
- * @author: Zhangmingda
- * @description: 定义一个接口,供任何USB设备相互对接
- * date: 2019/12/3.
- */
- public interface Usb {
- void connect();
- void disconnect();
- }
- package usb;
- /**
- * @author: Zhangmingda
- * @description: XXX
- * date: 2019/12/3.
- */
- public class Printer implements Usb {
- @Override
- public void connect() {
- System.out.println("打印机已连接。");
- }
- @Override
- public void disconnect() {
- System.out.println("打印机已断开连接,可以拔出了!");
- }
- }
- package usb;
- /**
- * @author: Zhangmingda
- * @description: XXX
- * date: 2019/12/3.
- */
- public class Disk implements Usb {
- @Override
- public void connect() {
- System.out.println("硬盘已连接。");
- }
- @Override
- public void disconnect() {
- System.out.println("硬盘已断开连接,可以拔出了!");
- }
- }
- package usb;
- /**
- * @author: Zhangmingda
- * @description: 定义计算机可以插入USB设备、移除USB设备功能
- * date: 2019/12/3.
- */
- public class Computer {
- Usb slot; //定义Usb 插槽,类变量
- //把USB设备插入USB卡槽,需要通过参数接收一个USB设备,实现了一个USB接口就行
- public void insert( Usb device){
- slot = device;//通过赋值模拟设备插在USB口中
- slot.connect();//插上就自动连接
- }
- public void pullout(Usb device){
- if(this.slot == null){
- System.out.println("USB口没有设备");
- return;
- }
- device.disconnect();
- this.slot = null;
- System.out.println("设备已拔出");
- }
- }
- package usb;
- /**
- * @author: Zhangmingda
- * @description: 测试计算机插拔 实现接口的设备
- * date: 2019/12/3.
- */
- public class ComputerTest {
- public static void main(String[] args) {
- //建立一个计算机对象、磁盘、打印机
- Computer computer = new Computer();
- Disk disk = new Disk();
- Printer printer = new Printer();
- //模拟插入拔出操作
- computer.insert(disk);
- computer.pullout(disk);
- computer.insert(printer);
- computer.pullout(printer);
- computer.pullout(printer);
- }
- }
java 、abstract修饰的【抽象类】【比如几何图形类】的更多相关文章
- java 接口 继承 接口 抽象类 继承 实体类
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 接口 可以 继承 接口 抽象类 可以 实现 接口 抽象类 继承实体类 需要 实体类 有 ...
- Java的修饰符
转自:http://blog.csdn.net/manyizilin/article/details/51926230#L42 修饰符: 像其他语言一样,Java可以使用修饰符来修饰类中方法和属性.主 ...
- 十、Java基础---------面向对象之抽象类与接口
抽象类(abstract) 当编写一个类时,时常会为该类定义一些方法,这些方法的使用用以描述该类的行为方式,那么这些方法都有具体的方法体.但是在某些情况下,某个父类只是知道子类应该包含怎样的方 ...
- Java中多态、抽象类和接口
1:final关键字(掌握) (1)是最终的意思,可以修饰类,方法,变量. (2)特点: A:它修饰的类,不能被继承. B:它修饰的方法,不能被重写. C:它修饰的变量,是一个常量. (3)面试相关: ...
- JAVA中接口与抽象类
抽象类总结 抽象类的概念:是使用关键字abstract修饰的类就是抽象类: 抽象类的产生:当多个不能相互继承的类具有相同的功能时,就需要将共同的信息向上抽取,放到公共的父类中:如果公共的父类只能描述所 ...
- Java中的继承抽象类和接口
一.总结 1.使用extends关键字继承,eg: class Student extends Persion { ...}; 2.Java编程规范中类的首字母大写,方法的首字母小写单词首字母代谢,e ...
- Java 5- Java 修饰符
Java 修饰符 Java语言提供了很多修饰符,主要分为以下两类: 访问修饰符 非访问修饰符 修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: public class ...
- abstract修饰符
abstract(C# 参考) abstract 修饰符指示所修饰的内容缺少实现或未完全实现. abstract 修饰符可用于类.方法.属性.索引器和事件. 在类声明中使用 abstract 修饰符以 ...
- Java中接口和抽象类的区别?
抽象类 抽象类必须用 abstract 修饰,子类必须实现抽象类中的抽象方法,如果有未实现的,那么子类也必须用 abstract 修饰.抽象类默认的权限修饰符为 public,可以定义为 public ...
- 【Java】接口和抽象类总结
一.接口 1.1 成员变量(其实是常量) 1.2 方法 二.抽象类 2.1 成员变量 2.2 方法 一.接口 1.1 成员变量(其实是常量) 成员变量默认用 public static final修饰 ...
随机推荐
- JDK中Lambda表达式的序列化与SerializedLambda的巧妙使用
前提 笔者在下班空余时间想以Javassist为核心基于JDBC写一套摒弃反射调用的轻量级的ORM框架,过程中有研读mybatis.tk-mapper.mybatis-plus和spring-boot ...
- CF1368E Ski Accidents
读懂题是第一要素. 考虑把点集分割为:\(A,B,C\) 首先把所有入度为\(0\)的点加入\(A\) 然后对所有入边只来自\(A\)的点加入\(B\) 然后对所有入边只来自\(B\)的点加入\(C\ ...
- mac 下 如何在同一窗口打开多个终端并实现快捷键切换
相信大家编代码的时候都会遇到,每次需要在头文件,库文件和源码文件中编代码的时候,总是需要在几个文件中切换来切换去的,而且一个文件就一个终端窗口,每次都要用鼠标点来点去,非常麻烦,所以如果能把这几个文件 ...
- Markdown-写作必备
Markdown--入门指南 导语: Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」.「语言」所迷惑,Markdow ...
- Java项目发现==顺手改成equals之后,会发生什么?
最近发生一件很尴尬的事情,在维护一个 Java 项目的时候,发现有使用 == 来比较两个对象的属性, 于是顺手就把 == 改成了 equals.悲剧发生...... == 和 equals 的区别 = ...
- JavaScript中var与let的异同点
var是JavaScript刚出现时就存在的变量声明关键字,而let作为ES6才出现的变量声明关键字,无疑两者之间存在着很大的区别.那么具体有哪些区别呢? 1.作用域表现形式不同,var是函数作用域, ...
- day03 部署NFS服务
day03 部署NFS服务 NFS的原理 1.什么是NFS 共享网络文件存储服务器 2.NFS的原理 1.用户访问NFS客户端,将请求转化为函数 2.NFS通过TCP/IP连接服务端 3.NFS服务端 ...
- Sharding-JDBC 实现水平分表
1.搭建环 (1) 技术: SpringBoot2.2.1+ MyBatisPlus + Sharding-JDBC + Druid 连接池(2)创建 SpringBoot 工程
- Web安全学习二
目录 常见漏洞攻防 SQL注入 注入分类 按技巧分类 按获取数据的方式分类 注入检测 权限提升 数据库检测 绕过技巧 CheatSheet SQL Server Payload MySQL Paylo ...
- 100个Shell脚本——【脚本9】统计ip
[脚本9]统计ip 有一个日志文件,日志片段:如下: 112.111.12.248 – [25/Sep/2013:16:08:31 +0800]formula-x.haotui.com "/ ...