Java程序开发中abstract 和 interface的区别详解

 更新时间:2022年01月19日 14:48:44   作者:士多啤梨苹果橙  
abstract class和interface在Java语言中都是用来进行抽象类。但是两者有什么区别呢,接下来小编给大家带来了abstract 和 interface的区别详解,感兴趣的朋友一起学习吧

先给大家说下基本概念

    在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进 行抽象类定义时对于abstract class和interface的选择显得比较随意。其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对 于问题领域本质的理解、对于设计意图的理解是否正确、合理。

  abstract class和interface在Java语言中都是用来进行抽象类(本文 中的抽象类并非从abstract class翻译而来,它表示的是一个抽象体,而abstract class为Java语言中用于定义抽象类的一种方法, 请读者注意区分)定义的,那么什么是抽象类,使用抽象类能为我们带来什么好处呢?

  在 面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是 所有的类都是用来描绘对象的(把类具体化),如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、 设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、 三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念 在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。

java开发里面经常会用到虚函数和接口,这两者的区别是什么呢?

abstract: 子类里面只能继承一个父类

interface: 子类可以实现多个接口

那什么时候用abstract,什么时候用interface呢?

当某个子类和父类是 is a关系时,比如一个亚洲人是一个人,那么一个亚洲人的子类可以继承一个人的父类。
当子类和父类是like a关系时,比如一个美洲超人像一个超人,超人的能力不是每个人都有的,所以不是所有人的属性,我们不能把超能力归于人的父类,这时就可以用interface

代码例子:

public abstract class Man {
public abstract void eat();
} 
public interface SuperPower {
public void superPower();
}
public class AsiaMan extends Man { 
@Override
public void eat() {
System.out.println("亚洲人用筷子吃");
}
} 
public class AmericanSuperMan extends Man implements SuperPower {
public void superPower() {
System.out.println("美国超人会飞");
}
@Override
public void eat() {
System.out.println("美国人用刀叉吃");
}
}
public static void main(String[] args) {
Man anAsiaMan = new AsiaMan();
AmericanSuperMan anAmericanSuperMan = new AmericanSuperMan();
anAsiaMan.eat();
anAmericanSuperMan.eat(); 
anAmericanSuperMan.superPower();
} 

运行结果:

美国人用刀叉吃
美国超人会飞
亚洲人用筷子吃

正确的使用abstract和interface有利提高代码可读性,当人们看到extend时就会知道这是一个is a什么,看到implement时可以知道这个类有什么特性like a

相关文章

  • 解决Java中的java.io.IOException: Broken pipe问题

    解决Java中的java.io.IOException: Broken pipe问题

    这篇文章主要介绍了解决Java中 java.io.IOException: Broken pipe的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • springboot集成shiro详细总结

    springboot集成shiro详细总结

    这几天在看 shiro,用 springboot 集成了一下,下面的这个例子中主要介绍了 shiro 的认证和授权,以及盐值加密的功能.程序可以运行起来.这里只做一个简单的介绍,后续会针对各个功能做一个详细的介绍,这里不做过多的赘述,需要的朋友可以参考下
    2021-05-05
  • Java连接 JDBC基础知识(操作数据库:增删改查)

    Java连接 JDBC基础知识(操作数据库:增删改查)

    这篇文章主要介绍了Java连接 JDBC基础知识,包括操作数据库之增删改查操作,需要的朋友可以参考下
    2021-04-04
  • java排序高级之选择排序实现方法

    java排序高级之选择排序实现方法

    这篇文章主要介绍了java排序高级之选择排序实现方法,较为全面的分析了选择排序的原理与具体实现技巧,非常具有实用价值,需要的朋友可以参考下
    2015-02-02
  • 深入理解java.lang.String类的不可变性

    深入理解java.lang.String类的不可变性

    不可变类只是其实例不能被修改的类。每个实例中包含的所有信息都必须在创建该实例的时候就提供,并且在对象的整个生命周期内固定不变,感兴趣的可以了解一下
    2021-06-06
  • mybatis的Interceptor机制

    mybatis的Interceptor机制

    这篇文章主要为大家介绍了mybatis的Interceptor机制源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 云计算实验:Java MapReduce编程

    云计算实验:Java MapReduce编程

    这篇文章主要介绍了云计算实验:Java MapReduce编程, 居于Java围绕MapReduce编程展开详细内容,文章助大家掌握MapReduce编程,理解MapReduce原理,需要的朋友可以参考一下
    2021-12-12
  • Java 线程的生命周期完整实例分析

    Java 线程的生命周期完整实例分析

    这篇文章主要介绍了Java 线程的生命周期,结合完整实例形式分析了java线程周期相关的加锁、释放锁、阻塞、同步等原理与操作技巧,需要的朋友可以参考下
    2019-10-10
  • ConcurrentHashMap是如何实现线程安全的你知道吗

    ConcurrentHashMap是如何实现线程安全的你知道吗

    这篇文章主要介绍了ConcurrentHashMap是如何实现线程安全的你知道吗,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • 在IntelliJ IDEA中多线程并发代码的调试方法详解

    在IntelliJ IDEA中多线程并发代码的调试方法详解

    这篇文章主要介绍了在IntelliJ IDEA中多线程并发代码的调试方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08

最新评论