抽象类和接口也是 Java 面试中常考的,下面就来总结一下抽象类和接口的相关知识。
抽象类是类,Java 中类是单继承的,抽象类是从其他子类中抽象出来的类模板,包含这些子类共有的成员(属性和方法),子类在抽象类的基础上进行修改。和普通类一样,抽象类中也有属性和方法,但是在类名上却多了一个 abstract 关键字和可以有普通类没有的抽象方法,并且抽象类不能实例化,其他的和普通类没什么不同。抽象方法是一个被 abstract 关键字修饰的方法,不能在抽象类中实现,抽象类中只是个方法声明,要在子类中实现,不管方法体内是否真的有内容。
接口不是类,也不能被实例化,java 中接口之间是也单继承的(子接口),类和接口之间不是继承而是实现,一个类可以实现多个接口。接口中也有属性和方法,但是却比普通类多了很多的限制。接口中的属性和方法都是默认是被 public 关键字修饰的,不管你写不写。并且属性默认还被 static 和 final 关键词修饰,也即是属性是一个静态常量,属性可以通过接口名称直接使用。接口中的方法在 Java8 之前只能声明不能实现,这样的话,在接口方法中添加一个方法,就需要在其所有实现类中就实现该方法,不管在方法体中是否有内容,而在 Java 8 之后,接口可以添加默认方法了,默认方法被 default 关键字修饰,这种方法可以直接在接口中实现,其实现类可以直接使用该方法(不用声明)或者根据需要重写这个默认方法。
总结一波,抽象类和接口的异同点:
相同点:
不同点:
从设计的角度上来看,抽象类提供的是一种 IS-A 的关系,满足里氏替换原则,即子类对象必须能够替换父类对象中的所有内容。而接口提供的是一种 HAS-A 的关系,是一个 “赋能” 者,能够让其他类以最小的代价拥有某种方法。比如现实生活中,商家使用支付宝微信收款,支付宝微信就可以看做是 “接口“,有了这些接口,商家就有了线上收款的能力。
抽象类和接口在一定程度上都实现了代码的重用,但在很多情况下,接口要优于抽象类,接口没有抽象类严格的层次要求,在面向对象设计中,善用接口可以降低代码的耦合性。在软件设计中,也提倡多用接口少用继承,对应的也有策略设计模式和面向接口编程思想。