Java 抽象类和普通类、接口的区别——看完你就顿悟了

2023-11-09

  分类:

版权声明:本文为博主csdn_aiyang原创文章,未经博主允许不得转载。

目录(?)[+]

概念:

抽象性和具体性都是相对的,不是绝对的。简单说,概念的内涵越小,则其抽象程度就越高,其外延也越大,反之亦然。比如“人”比“男人”抽象一点,而“生物”又比“人”更抽象一点,“物质”则比“生物”更抽象。
抽象的概念是由具体概念依其“共性”而产生的,把具体概念的诸多个性排出,集中描述其共性,就会产生一个抽象性的概念。抽象思维,是人类思维达到高级阶段产生的一种能力,例如,当小孩子思维尚未成熟时,他们只能掌握具体概念,他们在学习代词“你、我、他”时往往遇到困难,因为代词具有较高的抽象性。
总之,抽象概念的外延大,内涵小,具体概念的外延小,内涵大。

一、抽象类与普通类的区别:

1、普通类可以去实例化调用;抽象类不能被实例化,因为它是存在于一种概念而不非具体。

 2、普通类和抽象类都可以被继承,但是抽象类被继承后子类必须重写继承的方法,除非自类也是抽象类。

看一个实例:

[java]  view plain  copy
  1. public class Pet {  
  2.   
  3. public void play(){                //这是宠物类,普通父类,方法里是空的  
  4. }  
  5. }  
  6. --------------------------  
  7. public class Cat extends Pet {    //这是子类,是一个猫类,重写了父类方法  
  8. public void play(){  
  9.   System.out.println("猫爬树");  
  10. }  
  11. }  
  12. ------------------------  
  13. public class Dog extends Pet {    //这是子类,是一个狗类,重写了父类方法  
  14.   public void play(){  
  15.   System.out.println("狗啃骨头");  
  16.  }  
  17. }  
  18. -------------------------  
  19. public class Test {  
  20. public static void main(String[] args) {  //这是测试类,分别调用了子类的不同方法  
  21.   
  22. Pet p1=new Dog();                               //多典型的多态表现啊,相当的给力  
  23. Pet p2=new Cat();  
  24.   
  25. p1.play();  
  26. p2.play();  
  27. }  
  28. }  
-----------------------
输出结果:
狗啃骨头
猫爬树
-----------------------
问题:把父类改成抽象类,方法改成抽象方法,那么
public void play();//抽象方法没方法体
子类不变,依然重写父类方法,那这个跟普通父类没区别啊?
难道说就一个抽象方法没方法体就完事了??那我普通方法有方法体,我空着不写内容不就得了,不跟抽象方法一个样吗??
别跟我说抽象类还不能实例化,哥也不需要去new它!
普通类都能搞定的,还弄个抽象类有什么意义?我前面都说了普通类的方法我可以空着不写,达到跟抽象类方法没方法体一样的效果。
既然两种方式都能达到同一个输出效果,弄一种方式不就得了,那为什么还要创造出一个抽象类出来?难道是比普通类看着舒服?用着爽?还是更加便捷?还是为了强制让别人用的时候必须强制化实现抽象方法省的你忘了什么的?

答:就是为了强制不能实例化,以及强制子类必须实现方法这不是你忘不忘的问题
你说你不去new它就行了,这话没错
那你想另一个问题,为什么要有访问控制呢?为什么要有private和public之分呢?
我可以全部public,不该访问的,我不访问就行了啊
小程序里,看不出什么区别,反而private成员要写一堆set和get函数,多麻烦,我自己写小程序的时候也会偷懒全部public
但是项目大了,代码多了,这种严谨的结构就很重要了
且不说会有很多人合作一起写一个程序,哪怕还是你一个人写,也保不住有忘记的时候,那时候编译器不报错,茫茫码海上哪找错误去
面向对象说到底就是方便你思考,模块化,易维护管理,硬要说没必要,整个面向对象都没必要了,C语言有什么干不了的呀,运行效率还高。

二、抽象类与接口的区别:

1、概念不一样。接口是对动作的抽象,抽象类是对本质的抽象。
抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女人,这两个类(如果是类的话……),他们的抽象类是人。说明,他们都是人。人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它。
所以,在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口、走路接口)。

2、使用不一样:

 a.抽象类 和 接口 都是用来抽象具体对象的. 但是接口的抽象级别最高
b.抽象类可以有具体的方法 和属性,  接口只能有抽象方法和不可变常量
c.抽象类主要用来抽象类别,接口主要用来抽象功能.
d.抽象类中,且不包含任何实现,派生类必须覆盖它们。接口中所有方法都必须是未实现的。

 e.接口是设计的结果 ,抽象类是重构的结果

3、使用方向:当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。
注意:抽象类的功能要远超过接口,但是,定义抽象类的代价高。因为高级语言来说(从实际设计上来说也是)每个类只能继承一个类。在这个类中,你必须继承或编写出其所有子类的所有共性。虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时实现多个接口。在设计阶段会降低难度的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 抽象类和普通类、接口的区别——看完你就顿悟了 的相关文章

  • Lumerical学习之代码实现材料颜色与透明度的改变

    为了在仿真设计的时候让器件显得更有层次感 方便判断器件结构的各个部位 需要给材料设置合理的颜色和透明度 虽然可以在菜单栏的Material中直接调整材料颜色 但若是代码实现的话一方面可以重复利用 避免换个工程就在菜单栏重新设置 一方面也是给
  • 算法,CS学习,嵌入式学习,算法刷图,推荐资料,直接下载

    目录 附 算法代码库 附 CS 综合学习类 附 嵌入式 综合学习类 附 算法刷题总结 数据结构与算法简述和CS综述整理 本文非基础的教程 本文会列出大量学习和参考网站 老惯例 一个文章是一个集大成 本文借助了语音输入 PC 版 讯飞输入法
  • Spring Boot(二)配置一个阿里云的镜像

    1 新建项目 从中央仓库下载 太慢了 配置一个阿里云的镜像 1 从maven官网中下载apache maven 3 6 3 2 配置环境变量 添加path 3 验证 4 配置localRepository 新建文件夹 repo 用来存放从中
  • jQuery empty() VS remove()

    empty 和 remove的区别 empty remove empty empty 是移除被选元素的所有子节点 不包括自身 例子
  • c++派生类构造顺序

    1 整体构造顺序 前面我们提到过 一个类在构造的时候 先会构造其成员变量 在调用自身的构造函数 对于派生类来说 除了可能有成员变量 还可能有多个基类 在初始化派生类对象时 其构造函数要负责基类与基类成员对象的构造 还要负责自己成员对象的构造
  • 二叉树基本操作

    定义结构体 typedef int BTDatatype typedef struct BinaryTreeNode struct BinaryTreeNode left struct BinaryTreeNode right BTData
  • 分布式协议与算法——Raft算法

    目录 Raft算法 领导者选举 有哪些成员身份 领导者选举流程 选举细节 节点之间如何通信 什么是任期 选举有哪写规则 随机超时时间是什么 小结 日志复制 如何理解日志 如何复制日志 如何实现日志的一致 小结 节点成员变更 成员变更的问题
  • QCefView(1)—— CMAKE项目、库文件生成和项目测试

    目录 下载资源 说明文档 Quick Start with Qt Cef https tishion github io QCefView CMAKE生成 sln项目文件 库文件编译和测试项目编译运行 测试QCefView自带的项目QCef
  • 把Ethernet(以太网)基本工作原理说清楚

    文章目录 Ethernet 数据发送流程 1 载波侦听过程 2 冲突检测方法 发现冲突 停止发送 随机延迟重发 Ethernet帧结构 Ethernet V2 0标准 和 IEEE 802 3标准的Ethernet帧结构的区别 前导码 类型
  • java基础篇(一) 标识符、常量、变量、运算符

    一 标识符的学习和规则 1 定义 在程序中我们自定义的一些名称 在编程的过程中 经常需要在程序中定义一些符号来标记一些名称 如包名 类名 方法名 参数名 变量名 这些符号被称为标识符 2 组成元素 52个大小写英文字母a z 26 2 52
  • Moonbeam路由流动性

    Moonbeam路由流动性 Moonbeam Routed Liquidity MRL 使加密资产流动性能够从其他生态系统 如以太坊 Solana Polygon或Avalanche 进入波卡生态系统 借助MRL 用户可以通过简洁的用户体验
  • 大数据处理框架-Spark DataFrame构造、join和null空值填充

    1 Spark DataFrame介绍 DataFrame是Spark SQL中的一个概念 它是一个分布式的数据集合 可以看作是一张表 DataFrame与RDD的主要区别在于 前者带有schema元信息 即DataFrame所表示的二维表
  • Mysql多表连接

    表连接 前提 有时候我们需要的数据不止在一张表中 需要多个表结合查询时 就可以使用表连接 分类 1 1 内部连接 提供了两种表与表之间的连接方式 表与表之间建立起关联的列 要求列名可以不一样 但是这两个列的数据类型和内容得保持一致 1 2
  • Task01:概览西瓜书+南瓜书第1、2章(2天)

    第一章 绪论 1 1引入机器学习 引用周老师西瓜书对机器学习的解释 若计算机科学是研究关于算法的学问 则机器学习可以说是关于学习算法的学问 1 2 基本术语 机器学习是一门专业性很强的技术 它大量地应用了数学 统计学上的知识 周老师用挑选西
  • 【深度学习】CV_基于CNN的图像分类模型_代码逐行注释解析

    目录 前言 一 任务描述和关键环节 一 数据预处理 二 网络模块设置 三 网络模型保存与测试 二 具体步骤 一 任务分析与图像数据处理 1 导包 2 数据读取与预处理 2 1 数据读取 2 2 数据预处理 1 制作数据源 2 将预处理的数据
  • Nuxt3请求封装数据封装

    新建utils http ts import hash from ohash 后端返回的数据类型 export interface ResOptions
  • 重磅!Cloud Ace 在巴西圣保罗建立第一家南美子公司

    Cloud Ace Inc 总部 东京都千代田区 代表 青木诚 以下简称 Cloud Ace 于2023年3月10日宣布在巴西成立新子公司 Cloud Ace 一直在全球扩展其业务 从亚洲开始 目标是在世界各地设有办事处 我们最近加入的是在
  • Web菜鸟入门教程 - MyBatis通过数据库生成java代码

    SpringBoot大大简化了Web开发流程 可以这么说 做Web后来开发大部分时间就是在做配置文件修改 Web开发中 终端的运算能力越来越强 大部分场景就是数据库的操作 只有少部分逻辑会放在Web端处理 而这些增删查改基本属于标准的格式
  • 实现一个顺序存储的线性表(数据结构与算法 - 线性表)

    任务描述 本关任务 实现 step1 Seqlist cpp 中的SL InsAt SL DelAt和SL DelValue三个操作函数 以实现线性表中数据的插入 删除与查找等功能 相关知识 线性表是最基本 最简单 也是最常用的一种数据结构

随机推荐

  • Python list函数

    目录 描述 语法 使用示例 1 创建一个空列表 无参调用list函数 2 将字符串转换为列表 3 将元组转换为列表 4 将字典转换为列表 5 将集合转换为列表 6 将其他可迭代序列转化为列表 注意事项 1 参数必须是可迭代序列对象 将列表转
  • chrome中直接使用import

    现在我们在开发项目时都是基于构建工具 像webpack 上进行开发 所以在使用import时得心应手 但今天在chrome中直接使用import时 发现不知道如何使用 chrome中直接使用import 三个条件 浏览器版本需要支持 浏览器
  • c++常用输出函数详解

    1 printf printf的基本运用 printf是c 标准输出函数 目的是向标准输出设备按规定格式输出信息 格式如下 printf d a 上面的a是一个int形变量 但如果想输出一个字符型的变量 字符串等该怎么办呢 那我们就要把 后
  • 【mmdetection】小trick试验结果

    基准 faster rcnn r50 fpn 1x coco简称frrf config mAP 最好 模型大小 publish model cal train time s iter 1 frrf 0 9346 315 32MB
  • axios实现同步请求

    如何实现ajax请求的同步 通过jquery发送 将async属性设置为false 这样就会发送同步请求 在axios中 所有的请求都是异步发送的 所以单独用axios是实现不了同步的 需要结合async与await关键字使用 var da
  • ab压力测试 和 nginx 配置优化 及 用户打开的最大进程数

    原文 https blog csdn net wudinaniya article details 86064797 一 ab压力测试 和 nginx 配置优化 压力测试工具 ApacheBench 简称ab 是Apache 中自带的基准性
  • 毕业设计-基于 Python 的天气预测系统

    目录 前言 课题背景和意义 实现技术思路 一 Python 二 网络爬虫 三 基于 Python 的天气预测系统 四 系统测试 五 总结 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学
  • MATLAB 创建矩阵

    创建简单数值矩阵 输入矩阵是要以 为标识 矩阵的元素应在 内部 此时MATLAB才识别为矩阵 矩阵的同行元素之间可由空格或 分隔 行与行之间要用 或回车符分隔 A 1 2 3 4 5 6 7 8 9 运算结果 使用 zeros 函数和 on
  • luci流程简介

    LuCI作为 FFLuCI 诞生于2008年3月份 目的是为OpenWrt固件从Whiterussian 到 Kamikaze实现快速配置接口 LuCI是OpenWrt上的Web管理界面 LuCI采用了MVC三层架构 使用lua脚本开发 所
  • mysql不能使用别名做判断条件的解决方案

    错误例子 select name as n from user where n 张三 报错 n 字段在表user中不存在 解决办法 select name as n from user where name 张三 具体原因 请自行百度
  • SpringMVC框架从入门到精通

    文章目录 SpringMVC 框架介绍 概述 MVC模型 性能超群 工作原理 案例 展示汽车数据 需求 创建Maven module 创建RunApp java Car java CarController java 测试 处理请求参数 概
  • element-ui表格组件el-table实现行编辑与新增功能

    element前端ui组件挺美观的 我们也使用了他们的table组件 但是默认没有提供行编辑功能 我们可以通过将table的每个单元格换成input框来巧妙实现 默认每个单元格就是一个template数据填充 不可编辑 我们可以在templ
  • Qt-Web混合开发-QtWebChannel实现Qt与Web通信交互(4)

    Qt Web混合开发 QtWebChannel实现Qt与Web通信交互 文章目录 Qt Web混合开发 QtWebChannel实现Qt与Web通信交互 1 概述 2 实现效果 3 实现功能 4 关键代码 5 源代码 更多精彩内容 个人内容
  • 不仅仅好看!30个优秀logo的设计思想分析

    拥有一个抢眼的Logo对企业来乃一大幸事 毕竟Logo千千万 但真正让人过目不忘的作品可是屈指可数 好的Logo必须量体裁衣 迅速传递出企业的价值和理念 本文里精选了30个经典的标志设计 并附上设计思想分析 相信会对你受益匪浅 Castle
  • 从零开始的iOS开发: 20

    目录 一 开发环境 二 基础知识 1 往期知识点 2 简易自动布局 Stack View 三 实验步骤 1 先在Xcode建立一个APP项目 2 界面搭建 3 连接控件与代码 4 补充代码 完善功能 一 开发环境 开发工具 Xcode 12
  • 【Vue】Element-Plus 源码学习笔记——实现一个基本的 ElMessage 组件

    先贴下 Element Plus ElMessage 源码的网址 我们需要实现的效果类似 ElMessage 即能够显示多个消息 上一个消息消失下面的消息会自动往上移动 进入移出动画 自定义消息和持续时间 其他选项这里不考虑 大体思路 我们
  • C++ 风格指南

    0 扉页 0 1 译者前言 Google 经常会发布一些开源项目 意味着会接受来自其他代码贡献者的代码 但是如果代码贡献者的编程风格与 Google 的不一致 会给代码阅读者和其他代码提交者造成不小的困扰 Google 因此发布了这份自己的
  • Windows+Git+TortoiseGit+COPSSH安装图文教程

    跟师弟一起搭了个git本地服务器 他整理了一下相关内容 我转过来 准备工作 1 Git 1 8 1 2 preview20130201 exe 下载地址 https code google com p msysgit downloads l
  • 【RocksDB】Ubuntu20.04下编译rocksdb

    前言 我在刚学rocksdb的时候是在2022年 但是网上的资源很少 查了好久才把rocksdb安装成功 在这里向大家分享一下我的经历 安装过程中也报了很多错误 希望大家不要迷路 首先 在虚拟机里面安装依赖的包以及组件 总共七个依赖包和组件
  • Java 抽象类和普通类、接口的区别——看完你就顿悟了

    Java 抽象类和普通类 接口的区别 看完你就顿悟了 标签 java抽象类概念理解抽象类与接口区别抽象类与普通类区别 2017 05 04 16 26 1029人阅读 评论 0 收藏 举报 分类 Java 17 版权声明 本文为博主csdn