美文网首页Java 杂谈
Java基础-抽象类和接口

Java基础-抽象类和接口

作者: Wizey | 来源:发表于2018-09-02 08:19 被阅读6次

    抽象类和接口也是 Java 面试中常考的,下面就来总结一下抽象类和接口的相关知识。

    抽象类是类,Java 中类是单继承的,抽象类是从其他子类中抽象出来的类模板,包含这些子类共有的成员(属性和方法),子类在抽象类的基础上进行修改。和普通类一样,抽象类中也有属性和方法,但是在类名上却多了一个 abstract 关键字和可以有普通类没有的抽象方法,并且抽象类不能实例化,其他的和普通类没什么不同。抽象方法是一个被 abstract 关键字修饰的方法,不能在抽象类中实现,抽象类中只是个方法声明,要在子类中实现,不管方法体内是否真的有内容。

    接口不是类,也不能被实例化,java 中接口之间是也单继承的(子接口),类和接口之间不是继承而是实现,一个类可以实现多个接口。接口中也有属性和方法,但是却比普通类多了很多的限制。接口中的属性和方法都是默认是被 public 关键字修饰的,不管你写不写。并且属性默认还被 static 和 final 关键词修饰,也即是属性是一个静态常量,属性可以通过接口名称直接使用。接口中的方法在 Java8 之前只能声明不能实现,这样的话,在接口方法中添加一个方法,就需要在其所有实现类中就实现该方法,不管在方法体中是否有内容,而在 Java 8 之后,接口可以添加默认方法了,默认方法被 default 关键字修饰,这种方法可以直接在接口中实现,其实现类可以直接使用该方法(不用声明)或者根据需要重写这个默认方法。

    总结一波,抽象类和接口的异同点:

    相同点:

    • 抽象类和接口都不能被实例化,但是可以作为引用类型引用子类对象和实现类对象。
    • 子类继承抽象类,实现类实现接口,子接口继承父接口,子类必须实现抽象类中所有的抽象方法,实现类必须实现接口中所有的非默认方法,而子接口不是必要的。

    不同点:

    • 抽象类是类,接口是接口,类可以继承抽象类,也可以实现接口,但是接口只能继承接口,不能继承类。
    • 抽象类中的成员(属性和方法)可以是被 private、默认(default)、protected、public 关键字修饰,但接口中的成员只能被 public 关键字修饰,并且属性还要被 static 和 final 关键字修饰。
    • 抽象类虽然也不能实例化,但是却可以有构造方法,供子类使用,而接口则没有,并且抽象类中可以有静态代码块,接口也没有。

    从设计的角度上来看,抽象类提供的是一种 IS-A 的关系,满足里氏替换原则,即子类对象必须能够替换父类对象中的所有内容。而接口提供的是一种 HAS-A 的关系,是一个 “赋能” 者,能够让其他类以最小的代价拥有某种方法。比如现实生活中,商家使用支付宝微信收款,支付宝微信就可以看做是 “接口“,有了这些接口,商家就有了线上收款的能力。

    抽象类和接口在一定程度上都实现了代码的重用,但在很多情况下,接口要优于抽象类,接口没有抽象类严格的层次要求,在面向对象设计中,善用接口可以降低代码的耦合性。在软件设计中,也提倡多用接口少用继承,对应的也有策略设计模式和面向接口编程思想。

    觉得文章还不错,可以关注 编程心路 微信公众号,在编程的路上,我们一起成长。

    编程心路

    相关文章

      网友评论

        本文标题:Java基础-抽象类和接口

        本文链接:https://www.haomeiwen.com/subject/nabpwftx.html