Java中抽象类与接口的区别

《Java源码分析》:Condition 《Java源码分析》:Condition如下这篇博文讲解的Condition真心将的好,自己结合了源码也基本上对Condition有了一个大致的了解。写篇博客记录下。参考博客地址如下:http://ifeve.com/understand-condition/。API文档中对Condtion类列出的方法的说明如下1、 void await() 造成当前线程在接到信号或被中断之前一直处于等待状态。 2 阅读详情
       应某人的要求在这里以后会多谢一些技术日志。之所以选这个题目是因为这有助于真正理解面向对象的概念。而什么时候用抽象类,什么时候用接口这其实更多的是一个经验问题,我的经验自然是大大不足的。所以在这里只提出我的理解,希望其他人可以多多给出自己的意见。
      事实上,如果单单从这两门语言的语法上来说,区别是显而易见的。接口中只能有方法签名,不能有具体的实现,而抽象类中的抽象方法也不可以有实现,但是其他方法可以实现。另外,接口中的变量只能是static final的,而抽象类没有这个限制。
       相信如果学校开java课程,考试出这道题目,那就是满分了。但事实上这就是中国计算机教学的不足之处。对一门语言仅仅会用,仅仅不会发生编译级的错误是远远不够的。这样的回答很显然会遗留一个问题,那就是为什么要搞出抽象类和接口这两个概念,为什么要由这样的一种语法的机制?
      事实上,这些全都是为了实现一件事:多态!但是接口的多态和抽象类的多态还是有区别的。我个人的理解就是抽象类在表达继承关系,同时是在把在继承关系中的变化的东西和不变的东西分开!这在设计模式中称为Template method(模板方法)。下面我将以一个我在一个项目中实现的一个功能来说明抽象类的这种template method的思路。
      在作数据库查询的程序时,经常会在select查询语句后加where查询条件。通常的做法是这样的,写一个find方法,他的方法签名如下:public find(Map conditions) throws SQLException
      conditions就是存放where查询条件的键值对。但这样的实现是在比较麻烦,我就准备写一个Condition类专门用来存放查询条件,该类有个叫做conditionUnit的成员变量,conditionUnit就是name = 'zsj'的这样一个查询单元,数个查询单元是通过另一个成员变量connector连接的。事实上大多数情况下,connector要么是and要么是or。
       而conditionUnit里面有三个成员变量key,value和operator。对于name = 'zsj',key就是name,value就是zsj,operator就是=。但是这样还是不够,我的最终目的是在find方法里根本不用去拼凑where查询条件,只需将参数Map转成之前的Condition,Condition就能自己为你拼凑查询条件(事实上这样做是不好的,我在以后做了改进,Condition本身不做拼凑sql的工作,他只存放sql查询条件的数据单元,拼凑的工作由另一个类ConditionGenerator完成。这和在做图形化工具时,把界面和逻辑分开是一样的道理,因为能增加软件的可复用性)。为了拼凑查询语句,就必须在conditionUnit类里添加一个generateUnit方法来将key,value和operator连接起来。注意,绝对不是像你想的那么简单,把key+operator+value就可以了。关键在于,对于sql的类型,varchar和char以及其他一些类型的的数值类型两边要加单引号’,比如name如果是varchar型的话,zsj就要写成'zsj',但是对于一些数字类型,则不需要加。问题就在于到底是哪个类型,这个类本身是不知道的,这件事情只有在运行时才能知道。好了,那我就干脆不实现这个方法,而把这个方法改成抽象方法。然后我在写VarcharConditionUnit,NumericConditionUnit类去继承ConditionUnit这个抽象类(因为已经有了抽象方法generateUnit)。在这些子类里我在根据子类所对应的情况去实现generateUnit这个抽象方法,这就是template method的设计模式,也是我所认为的抽象类的最大的作用:将不变的东西同统一在基类里,而将变化的东西做成抽象方法由子类去覆写(overriding),这样的一个抽象基类就是一个template(模板)。这就是所谓的将不变的东西和变的东西分开,不变的东西在编译时已经决定,而变化的东西由Java用RTTI的机制去动态获取。比如ConditionUnit cu = new VarcharConditionUnit; cu.geneateUnit();对于java而言,第二句语句,它是肯定不会去掉用那个抽象类的抽象方法的,因为根本没有实现,那java究竟是怎么知道cu究竟是什么呢?这就是靠动态绑定技术实现的!
      下面在谈谈接口。接口的多态和抽象类不同,是不带有任何继承色彩的。举个例子,若将飞机抽象成一个类,将飞做成一个接口,那我只能说飞机实现了飞,绝对不会说飞机是飞。但是上述的例子VarcharConditionUnit和NumericConditionUnit确实都是ConditionUnit。对于飞来说不一定只有飞机能实现,若把飞艇抽象成一个类,也可以实现飞。显然飞机和飞艇的飞行机制是完全不同的,但是对于一个想要从一个城市飞去另一个城市的人来说(不考虑时间等其他因素),他才不管飞机和飞艇的内部飞行机制是怎么样的,他只知道能非就行!!!更为极端的是,如果把他眼睛蒙住过数个小时从一个城市到了另一个城市,他根本就不知道做的是飞机还是飞艇,也不需要知道。
      这就是接口的作用,连接模块与模块之间的功能而不需要知道各自的内部实现。而面向对象开发的一个原则就是面向接口编程。而我理解的面向接口编程的作用就是为了实现模块于模块之间的松耦合,而接口就是实现松耦合的最好工具。还有一个例子就是台灯永远只需要插在插线板这个接口上而不需要知道插线板内部的排线结构。下面在举个开发的例子。写数据库操作无非就增、删、改、查四种操作。若要进行操作的表名是Classroom那么我可以定义一个ClassroomBean的接口。这样做的好处在于若客户本来要求用的数据库是db2,一个月后突然要求改成Oracle 了(注意不同的数据库所支持的sql语法是有所差异的)那么我只需要将原来的ClassroomBeanDB2Impl类换成我现在新实现的ClassroomBeanOracleImpl类就可以了,如果之前一直是面向ClassroomBean接口开发的话,那么所有的代码就不需要任何改动了。这也就是所谓的可插拔的开发。将不用的ClassroomBeanDB2Impl拔去,插上ClassroomBeanOracle。
      最后总结一下,抽象类和接口都是实现多态的一种工具,而抽象类的目的是将变化的与不变的东西分开,体现一种继承的结构层次,而接口的目的则在于实现模块于模块之间的松耦合。但是多态的特点是一样的那就是同一个表征(接口方法和抽象方法)可以有多个内部实现(实现类的方法和子类的覆写方法)。以上是我个人的理解,还希望大家多多发表评论!
 
持续更新linux好用的命令行 持续更新linux一些好用的命令行 阅读详情

相关推荐

FTViewSE利用VB脚本制作简易日报表

罗克韦尔SE用VB做的简单的报表

z0800656的博客 3024

linux ubuntu 实用命令汇总(持续更新)

linux ubuntu 实用技巧汇总(持续更新)

weixin_43774168的博客 1427

随机向量函数链神经网络(RVFLNN)简介——附测试代码

宽度学习(Broad Learning System)原理介绍:随机向量函数链神经网络(RVFLNN) 目录宽度学习(Broad Learning System)原理介绍:随机向量函数链神经网络(RVFLNN)结构分析和训练优化 函数链神经网络(Functional-link neural network,简称FLNN)的结构如下图。 和深度神经网络结构不同的是,FLNN相当于把隐层放到了输入层中,作为增强结点(Enhancement nodes)。也可以理解成FLNN在输入层就对输入向量进行了非线性变换

weixin_44517742的博客 1万+

Linux实用命令汇总(持续更新...)

  经常会为某个简单的命令名google,baidu,于是觉得有必要自己开个页面,持续的更新这些命令。 判断shell脚本的输入参数个数 命令:   argc=$#   使用例子:   if [ $# -ne 1 ] then echo "Usage: $0 tabname"; echo "e.g.: $0 cdr_20110114"; exit 1...

红枣 153

Adobe Acrobat Pro(Adobe PDF) - 使用技巧

Adobe Acrobat Pro为Adobe出品的PDF查看和编辑软件,下文简称Adobe PDF,该软件功能强大,拥有查看PDF、编辑PDF、打印PDF、导出PDF、合并文件、组织页面、文本标注、注释、动作向导、等功能。本文介绍Adobe PDF的一些使用技巧,最后介绍软件设置。

NSJim的博客 4万+

【CASS精品教程】006:CASS7.1 道路设计参数文件打开无响应,提示roadpara解决办法,权威解决办法汇总

在用CASS7.1 软件进行断面法土方量计算,在生成断面图后,需要进行道路设计参数文件的设计,打开断面设计参数文件的时候,无响应,提示roadpara,如下所示: 道路设计参数文件 解决办法有三种 第一种方法:Win+R (1)64位系统:输入regsvr32 C:\Windows\SysWOW64\CellCtrl5.ocx,回车 (2)32位系统输入regsvr32 C:...

智慧空间实验室 1万+

Linux命令随记

记录操作Linux时偶尔忘记的命令 1.将某个文件夹下的文件名带某个字符串的所有文件(文件名过长)复制到指定文件夹 find -name "*xxx*" | xargs -i cp {} /home/XXX/XXX/ ...

黑条纹的白斑马的博客 240

【深度学习|Transformer模型学习】什么是前馈神经网络(Feed-Forward Neural Network)?将前馈神经网络中的全连接层变成1*1卷积层会有什么样的效果?

【深度学习|Transformer模型学习】什么是前馈神经网络(Feed-Forward Neural Network)?将前馈神经网络中的全连接层变成1*1卷积层会有什么样的效果?

985小水博的摸鱼日常 1377

linux返回用户主目录的命令有哪些,Linux基本命令汇总 - 持续更新

Linux基本命令汇总 一、Linux管理文件和目录的命令点击如下标题,会自动跳转到该命令详解 ~1、pwd命令2、cd命令3、ls命令4、cat命令5、grep命令6、touch命令7、cp命令8、mv命令9、rm命令10、vi命令11、dd命令一、Linux管理文件和目录的命令1、pwd命令#注:pwd命令会输出当前工作目录的完整路径主要用法:(1)pwd命...

weixin_28866737的博客 1万+

【测开求职】面试题:操作系统 吐血整理

本篇文章是笔者为准备研究生复试和校招而写,因此主要针对问答,注重理解,而不在于细节计算。涵盖考研范围内的所有知识内容,读者可以先查看上面的链接走一遍操作系统的整体框架结构。其中,重点难点以及易混淆的知识点,笔者用其他文章进行了详述,在知识点处贴好了链接,有需要的可以查阅。另外操作系统在校招中有非常明显的重点,一般情况下只会考察进程管理,内存管理,和设备管理,且这三者考察频率依次递减,文件管理基本不会考察。

vector的博客 7912

PCL 将对象模板与点云对齐【2025最新版】

PCL模版匹配算法的使用案例,博客长期更新,本文最近更新时间为:2025年1月18日。

点云侠的博客 5379

linux Shell 命令汇总 (持续更新)

linux shell 命令汇总 (持续更新)

weixin_43774168的博客 9978

安川机器人外部轴添加

本文详细介绍了如何在安川机器人本体上添加第7轴以及如何设置动作,本文以添加点焊枪为例进行讲解。

haier123888的博客 7895

Linux命令 安装升级相关命令(一) (持续更新)

Linux命令常用命令持续更新 声明:本人菜鸟一枚,资料均是在网上和书上收集的.如有不对的地方,勿喷,欢迎大佬指出. sudo apt-get update 更新命令 apt-get 命令是 Ubuntu 系统中的包管理工具,可以用来安装、卸载包,也可以用来升级包 语法格式: apt-get [options] command sudo apt-get upgrade 升级命令 该命令,将本地已安装的软件与下载的软件列表里对应软件进行对比,如果发现已安装的软件版本太低,就会提示你更新。如果你

qq_34508123的博客 1万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

linux实用命令及注意(持续更新)

1、cp -a src/* des不会复制src目录以及子目录的文件(夹),cp -a src/. des则会复制所有文件(包括隐藏文件)。 2、du -h --max-depth=1 . 显示当前目录每个子目录的大小

常胜将军的博客 2336

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Linux基础命令汇总【持续更新】

学到现在,我已经接触了很多的linux命令。有些杂,所以在这里写一篇汇总后的linux基本命令,方便个人及网友查看。

金湖OneFish 375

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Linux命令汇总(持续更新中······)

本文介绍了 Linux 系统的基础知识Linux命令的使用、目录操作、文件操作、shell脚本的编写命令等,并给出了使用的示例说明。帮助Linux初学者和运维人员参考学习,小编的文章会不定时持续更新,以满足广大读者的参考学习。

weixin_45844208的博客 669

【汇总篇】Linux命令汇总(持续更新)

Linux命令汇总 编号 命令 说明 实例 1 cd 路径 改变当前用户所在位置 2 pwd 查看当前所在位置的路径 3 mkdir 目录名 mkdir -p /a/b/c 创建一个目录 使用-p参数创建多级目录 4 rmdir 目录名 rmdir -p /a/b/c 创建一个目录 使用-p参数创建多级目录 ...

weixin_42343146的博客 190

Linux实用命令整理<持续更新中ing>

Linux实用命令整理<持续更新中ing>

zxc_wzhzjqeds的博客 719

linux 实用命令/工具(持续更新)

查找包含某字符串的文件及位置: find .|xargs grep -ri "要查找的字符串" 查找文件位置: find [查找路径] -name "文件名" eg:find / -nam

@角色扮演# 1029

linux常用命令汇总-持续更新

文章目录1、放入后台 1、放入后台 有时候不要程序一直占用前台显示页面。可以将其放入到后台进行运行。 # 命令 & ;注意:不能与前台有交互。否则前台终端依然有显示 cp -R original/dir/ backup/dir/ & # nohup和&一起使用 nohup docker pull tomcat:8.5.53 & # jobs 查看【当前】终端后台运行的任务 jobs -l # bg 将一个在后台暂停的命令,变成在后台继续执行 bg %序号 # fg 将一个在

可乐多点冰的博客 765

Linux常用命令汇总(持续更新)

doc"      支持通配符。

西敏寺的乐章的博客 1509

linux命令常用来做什么,Linux经常使用命令汇总(持续更新)

在Linux操做系统中,用户在命令行shel中经过shell命令简单粗暴有效的和内核交互~1.什么是shell从字面来看,shell是外壳的意思,Linux shell即linux内核的外壳,提供给用户操做内核的接口;从实现来看,shell是一个命令解释器,从标准输入接收用户命令,将命进行解析并传递给内核,内核则根据命令,做出相应动做,若是有反馈信息,则输出到标准输出上,如图: 2.Linux中执...

weixin_42202605的博客 823

Linux常用命令总结(持续更新)

目录1、cd xxx2、cd ..3、cd ~4、 cd /5、 1、cd xxx 进入xxx目录 2、cd … 返回上一级目录 3、cd ~ 进入当前用户的home目录 4、 cd / 进入根目录 5、

weixin_44164489的博客 973

linux命令汇总(持续更新)

一些常用linux命令总结 查看ip ip addr ifconfig 清屏 ctrl +L clear

dy051107的博客 176

Linux常见命令——持续更新

本文介绍了Linux系统的基础知识,包括Shell解释工具、目录结构和常用命令。重点讲解了/bin、/etc、/dev等核心目录的作用,以及pwd、cd、ls等基础命令的使用方法。文章还详细说明了文件权限表示法、通配符应用技巧,以及echo、cat等文本处理命令的实用操作。对于Linux初学者,本文提供了从目录导航到文件管理的基础操作指南,帮助快速掌握Linux系统的核心概念和日常运维技巧。

falsezxy的博客 635
上一篇: 对于计算机语言学习的一个小结
下一篇: Java的Classloader
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值