• 面试:抽象类和接口


    【基础】Java抽象类与接口的区别与使用场合_Amos-Chen的博客-CSDN博客

     Java 抽象类和接口,看这一篇就够了 - 沉默王二博客

    抽象类与接口的区别

    • 最重要的区别是,接口的方法不可以有实现,并且是绝对的抽象方法。抽象类可以有实例方法用来实现默认行为。
    • 接口中的变量申明默认是final, 而抽象类中变量申明可以是非final。
    • 接口中的成员默认是public修饰,而抽象类中成员可以是private, protected等等。
    • 接口通过关键字implements被其他类实现,而抽象类则是通过extends关键字被其他类扩展.
    • 接口可以扩展(extends)另外一个/或多個接口,抽象类可以扩展(extends)另一个Java类并(或)实现(implements)多个Java接口.
    • Java类可以实现多个接口但是只能扩展一个抽象类.
    • 接口是绝对抽象而且无法实例化,抽象类也无法实例化但是如果类中有main()方法是可以被调用的。
    • 与抽象类相比,接口更慢,因为它需要额外的间接寻址。

    何时用抽象类何时用接口

    接口用来定义契约行为,也可作为两个系统间的契约进行交互。

    而抽象类主要用来为子类定义默认行为,也就是说所有的继承子类都需要运行相同的功能。

    何时使用抽象类

    抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。

    包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法,抽象类和普通类的区别:

    • 抽象方法必须为 public 或者 protected(因为如果为 private,则不能被子类继承,子类便无法实现该方法),默认情况下默认为 public。
    • 抽象类不能用来创建对象;
    • 如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为 abstract 类。

    其他方面,抽象类和普通没有区别,一般抽象类用于继承中提高扩展性。

    • 如果我们使用继承概念,那么抽象类是个不错的选择。因为它为派生类提供了一个通用基类实现。
    • 如果想为组件的所有实现中提供公共的且已实现的功能,那么使用抽象类,它允许我们部分实现类。而接口不为任何成员提供任何实现。

    接口

    接口中可以含有 变量和方法。但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。

    从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。

    java8新特性 - 接口中可以定义默认实现方法和静态方法

    Java8 之后 在接口中可以使用default和static关键字来修饰接口中定义的普通方法

    1. public interface Interface {
    2. default String getName(){
    3. return "zhangsan";
    4. }
    5. static String getName2(){
    6. return "zhangsan";
    7. }
    8. }

    Java8以后,抽象类和接口该怎么选?

    Java8以后,抽象类和接口该怎么选?

    抽象类在设计上的主要目标之一是复用,子类作为父类的子集,从而可以复用父类的某些逻辑,包括属性(或者说状态)和行为。个人觉得抽象类不是一个很必要的东东。只有当开发者特别在意代码质量与架构设计、希望尽量少地向下级用户暴露封装好的信息时,抽象类才能起到关键的作用。

    单单从语法角度来看,java8以后,接口和抽象类越来越像了!但是当我们思考一个抽象方法该放在抽象类还是接口中时,那么只要简单判断这个抽象方法是否会被子类用多态来调用,就可以简单分类。牢记文章中的实例,不同的门,开门的方式是不同的,所以门应该设计为抽象类而不是接口!

  • 相关阅读:
    Redis持久化RDB/AOF
    《Python+Kivy(App开发)从入门到实践》自学笔记:高级UX部件——RecycleView遍历并显示数据
    17 Transformer 的解码器(Decoders)——我要生成一个又一个单词
    MyBatis调用SqlServer存储过程
    Jetpack Compose中的state核心思想
    python学习笔记1-SortedList的使用
    DataFrame窗口函数操作
    2022牛客多校联赛第九场 题解
    SHRM在中国的认可度如何?这里说了实话
    商城免费搭建之java商城 开源java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c
  • 原文地址:https://blog.csdn.net/cpcpcp123/article/details/128064708