Java中抽象类与接口的区别

Java中抽象类与接口

Java中抽象类

  • 抽象类的定义

    定义:类的修饰符 abstract class 类名
    抽象类跟普通的类定义相比,就是在原来的基础上,加上一个abstract关键字。

    Java语言中,用abstract 关键字来修饰一个类时,这个类叫作抽象类。抽象类是它的所有子类的公共属性的集合,是包含一个或多个抽象方法的类。抽象类可以看作是对类的进一步抽象。在面向对象领域,抽象类主要用来进行类型隐藏。(摘自百度百科

  • 为什么需要定义抽象类,而不是普通的类

    如果一个类,我们通常不会实例化,而且含了一些公共的属性和方法,我们就可以把它定义成抽象的。比如说人,就可以定义为抽象类Person。

  • 抽象类使用总结:

    1、在Java中使用abstract关键字定义的类就是抽象类,采用abstract关键字定义的方法就是抽象方法
    2、抽象类是不能被实例化的,就像现实世界中的人,其实是抽象的,张三才是具体的人的一个实例。
    3、抽象的方法只需在抽象类中,提供声明。抽象类中的抽象方法只有方法体,不需要在抽象类中进行实现。
    4、如果一个类中含有抽象方法,那么这个类必须定义成抽象类,当然,抽象类中,可以没有抽象方法。
    5、如果一个子类继承了抽象类,那么,抽象类中的所有的抽象方法必须被子类复写。如果在子类中不复写该抽象方法,那么必须将此方法声明为抽象方法。
    6、抽象类不能被final修饰,因为抽象类就是用来被继承的,而final修饰后的类,不能被继承,两者有冲突。
    7、抽象方法不能被final修饰,因为抽象方法就是用来被子类实现的,而final修饰的方法不能被覆盖,这和final有冲突。
    8、在抽象类中,我们可以将一些公共的属性变量放到抽象类中,也可以包含一些公用方法的实现。当然啦,抽象类使用的重要意义在于在抽象类中,我们可以定义一些抽象的方法,这样就会存在一个约束,而子类必须实现我们定义的方法,抽象类中的方法名称,子类又不能修改,这样就能很好的实现多态的机制,有了多态的机制,我们在运行期就可以动态的调用子类的方法。从而在运行期可以灵活的互换实现。

Java中接口

  • 接口定义:
    Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。(摘自百度百科

    这里的接口有两种含义:
    1、Java接口,Java语言中存在的结构,有特定的语法和结构;
    2、一个类所具有的方法的特征集合,是一种逻辑上的抽象。前者叫做“Java接口”,后者叫做“接口”。

  • 接口使用总结:

    1、在Java中,接口使用interface声明类。
    2、接口可以看作是抽象类的一种特殊情况,在接口中只能定义抽象的方法和变量。
    3、接口中的方法,只能由子类通过implements关键字来实现。
    4、接口中的变量默认都是public static final类型的,不能更改,所以必须显示的初始化。
    5、接口中的方法默认都是public abstract的,方法的定义格式不能更改。
    6、接口不能被实例化,另外,接口中没有构造函数的概念。
    7、接口之间可以继承,但接口之间不能实现。
    8、如果一个类实现了接口,那么这个子类,必须实现接口中所有的方法。
    9、接口相比较类而言,类只能单继承,而接口可以多实现。

接口和抽象类的区别

  • 共同点:

    a) 接口和抽象类都不能被实例化

    b) 抽象类和接口都是用来抽象具体对象的,要面向接口(抽象)编程,而不要面向具体编程。虽然都进行了不同程度的抽象,但是接口的抽象级别最高。

  • 不同点:

    a) 抽象类要被子类继承,而接口是用来被子类实现的。

    b) 接口只能做方法声明,不能有方法的实现(接口默认方法实现除外),抽象类中不仅可以作方法声明,也可以做方法实现。

    c) 实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。接口一方面解决java的单继承问题,另一方面,实现了强大的可插拔性(多态机制)。

    d) 抽象类可以有抽象方法、具体的方法和属性,而接口只能有抽象方法和不可变常量。接口里定义的变量只能是公共的静态的常量(public static final),抽象类中的变量是普通变量。

    e) 接口是设计的结果,抽象类是重构的结果。抽象类主要用来抽象类别,强调的是所属关系,接口主要用来抽象功能,强调的是特定功能的实现。

  • 使用总结

    a) 抽象类的存在主要是可以把公共的代码移植到抽象类中。

    b) 使用时,优先选择接口(因为继承抽象类后,此类将无法再继承,所以会丧失此类的灵活性)

接口与抽象类的异同点(面试用)

相同点

  • 都可以定义抽象方法
  • 都不能实例化对象
  • 定义的抽象方法都需要被重写
  • 都可以定义public static方法,public static final常量(接口中一般不这么用)

不同点

  • 意义不同
    抽象类是对事物更高层级的抽象
    接口是对功能的封装
  • 定义方式不同
    抽象类用 abstract class定义
    接口用interface定义
  • 内容不同
    抽象类中除了抽象方法外,还可以定义构造方法等普通类中定义的所有成员
    接口不能定义构造方法
  • 使用方式不同
    抽象类需要被子类extends继承
    接口需要被实现类implements实现
  • 类只支持单继承,接口支持多实现
  • 应用场景不同
    一般情况下,对类进行功能的扩展,优先选择接口
    除了扩展功能外,还需要保存不同的数据,只能选择抽象类。抽象类的抽象方法需要子类重写,抽象类还可以约束所有的子类都具有相同的功能。

注: 上文中接口不能有方法的实现,其实说的不是很严谨,在JDK1.8之后,在接口里面可以定义default方法,default方法里面是可以具备方法体的,当子类实现该接口之后,不需要重写该方法即可以调用该方法

public interface Test {

    /**
     *
     * @param
     * @return void
     * @Date 2021/10/3 17:53
     */
    default void getCustomerInfo(){

    }

    void test();

}

转载:Java中抽象类与接口,一篇就够啦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值