当前位置:网站首页>什么是抽象类?什么时候用?什么是接口?抽象类与接口的区别?
什么是抽象类?什么时候用?什么是接口?抽象类与接口的区别?
2022-08-10 20:17:00 【编程ID】
什么是抽象类?
Java语言中,用abstract 关键字来修饰一个类时,这个类叫作抽象类。抽象类是它的所有子类的公共属性的集合,是包含一个或多个抽象方法的类。抽象类可以看作是对类的进一步抽象。在面向对象领域,抽象类主要用来进行类型隐藏。
为什么要用抽象类?它存在的意义是什么?
无法完整描述一个类,只能抽象化概念来使用
例如:首先,有一个父类Animal,接着有两个子类,分别是鸟Bird和狗Dog,如下:
public class Animal{
public void bark(){
}
}
public class Bird extends Animal{
public void bark(){
System.out.println("叽叽喳喳~");
}
}
public class Dog extends Animal{
public void bark(){
System.out.println("汪汪汪~");
}
}
可以看到,父类Animal有一个叫唤的方法bark(),两个子类都继承了这个方法,并进行了重写,Bird是叽叽喳喳叫,Dog是汪汪叫,现在的问题是Animal怎么叫?它的bark()方法体里应该输出什么样的叫声,是“汪汪”还是“叽叽喳喳”?
显然,动物是个抽象的集合名词,我们并不知道动物Animal怎么叫,所以,bark()方法在父类中实现不了,或者说实现了没有任何意义,bark()方法只能在子类中根据具体情况去实现。这样的话就可以把父类Animal中的bark()方法声明为abstract抽象方法,此时这个类也成了abstract抽象类。
至此,也就可以回答第一个问题,为什么要用抽象类?抽象类自己并不能实例化,它存在的意义就是为了让子类继承。对于一个父类,它的某个方法在父类中实现没有任何意义,必需在子类中根据具体情况实现,那么这个方法可以声明为abstract抽象方法,此时这个父类也成了abstract抽象类。
抽象类怎么用?
Java中规定用abstract来修饰抽象方法和抽象类。上面的Animal类写成如下形式:
public abstract class Animal{
public abstract void bark();
}
什么是接口?
接口就是一个规范,类似于硬件上面的接口,在电脑主板上的PCI插槽的规范就类似于Java接口,只要是遵循PCI接口的卡,不过是什么牌子的都可以插入到PCI插槽中。所以接口就是一个规范。接口就是某个事物对外提供的一些功能的说明。我们还可以利用接口实现多态功能,同时接口也弥补了Java单一继承的弱点,也就是类可以实现多个接口。
我们使用interface关键字定义接口,一般使用接口声明方法或常量,接口中的方法只能是声明,不能是具体的实现,这一点和抽象类是不一样的。接口是更高级别的抽象。接口的定义格式是:
[访问控制符]interface <接口名> {
类型标识符final 符号常量名n = 常数;
返回值类型 方法名([参数列表]);
…
}
public interface NameOfInterface
{
//任何类型 final, static 字段
//抽象方法
}
什么是接口?
接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。
Java里面由于不允许多重继承,所以如果要实现多个类的功能,则可以通过实现多个接口来实现。
接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。
举个最简单的例子,数据库的3种操作,mysql,mysqli以及pdo,它们都可以操作数据库,但是它们的操作方法又不一样,这时候如果我想在我的网站系统里同时加入这3种数据库操作并可以随意选择,而且使用它的人只需要知道一种统一的操作方法怎么办?没错,这时候你就要用接口来开发了。首先你定义一个接口比如叫Db,Db里有3个方法connect,query,close,然后你写3个类mysql,mysqli,pdo都实现这个接口的3个方法(可能数据库的连接不叫connect方法,但是你实现连接的方法已经封装在connect里了)。这时候外面只需要用Db这个接口,他都只需要调用connect,query,close这三个方法就行,而不用管你mysql,mysqli,pdo里都有什么方法,这也就实现了3种数据库随意切换,但是你代码不用改,因为你调用的只有connect,query,close这三个方法
怎么区别抽象类与接口?
抽象类和接口的使用就是is和has的区别:比如人相对于男人,小孩,女人就是is,那么就应该是抽象类,因为他们都是人,有人所有的特点。而可行动相对于人,汽车,飞机就是has,那么就是接口,因为他们有这样的功能,但不具有is的特征。
接口和抽象类的特点区分
1.抽象类里面可以有非抽象方法。但接口里只能有抽象方法,接口体现的是一种规范,抽象类体现的是模板式设计。
2.接口(interface)是抽像类的变体。在接口中,所有方法都是抽像的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽像的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对像上调用接口的方法。由于有抽像类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof运算符可以用来决定某对象的类是否实现了接口
3.接口里不可以定义静态方法,抽象类里可以。接口里的变量全部为静态常量,抽象类里可以有普通变量。
4.接口里不可以有构造函数和初始化块,抽象类里可以有。
5.一个类可以实现多个接口,但只能继承一个抽象类。
嘿嘿!喜欢的点个赞再走呗!!!
边栏推荐
- mysql踩坑----case when then用法
- 三子棋的设计和代码
- 转铁蛋白修饰长春新碱-粉防己碱脂质体|转铁蛋白修饰共载紫杉醇和金雀异黄素脂质体(试剂)
- 哈工大软件构造Lab3(2022)
- QSslSocket has not been declared
- The servlet mapping path matching resolution
- zip文件协议解析
- 烟雾、空气质量、温湿度…自己徒手做个环境检测设备
- 【SemiDrive源码分析】【MailBox核间通信】52 - DCF Notify 实现原理分析 及 代码实战
- cordova installation error Command failed: powershell solution
猜你喜欢
电脑开不了机是什么原因?
mysql踩坑----case when then用法
【C#】WCF和TCP消息通信练习,实现群聊功能
赎金信问题答记
铁蛋白-AHLL纳米颗粒|人表皮生长因子-铁蛋白重链亚基纳米粒子(EGF-5Cys-FTH1)|铁蛋白颗粒包载氯霉素Chloramphenicol-Ferritin
YOLOv3 SPP source analysis
网站架构探测&chrome插件用于信息收集
多功能纳米酶Ag/PANI|柔性衬底纳米ZnO酶|铑片纳米酶|Ag-Rh合金纳米颗粒纳米酶|铱钌合金/氧化铱仿生纳米酶
ACM MM 2022 统一归一化:加速Transformer工业部署的归一化方法
机器学习|模型评估——AUC
随机推荐
报错:runtime error: reference binding to null pointer of type ‘std::vector<int, std::allocator<int>>‘
怎么完全卸载赛门铁克_Symantec卸载方法,赛门铁克卸载「建议收藏」
铁蛋白-AHLL纳米颗粒|人表皮生长因子-铁蛋白重链亚基纳米粒子(EGF-5Cys-FTH1)|铁蛋白颗粒包载氯霉素Chloramphenicol-Ferritin
洛谷 P1629 邮递员送信 (三种最短路)
TDD、FDD是什么意思?
机器学习模型验证:被低估的重要一环
[Natural Language Processing] [Vector Representation] PairSupCon: Pairwise Supervised Contrastive Learning for Sentence Representation
皮质-皮质网络的多尺度交流
"Distributed Microservice E-commerce" Topic (1) - Project Introduction
【语义分割】2016-SegNet TPAMI
网站架构探测&chrome插件用于信息收集
Ferritin particle-loaded raltitrexed/pemetrexed/sulfadesoxine/adamantane (scientific research reagent)
线性结构----链表
【C#】WCF和TCP消息通信练习,实现群聊功能
(10) Sequence and deserialization of image data
WCF and TCP message communication practice, c # 】 【 realize group chat function
深度学习实战教程(一):感知器
【毕业设计】基于STM32的天气预报盒子 - 嵌入式 单片机 物联网
Echart饼状图标注遮盖解决方案汇总
Public Key Retrieval is not allowed(不允许公钥检索)【解决办法】