java — 抽象类和接口
老生常谈的一个概念,很明确,不过我们多从几个角度来看下应该会有更好的理解,最近翻了下java8的某些新特性
关于接口的新特性让笔者受惊了,下面结合下做个总结,有更新的话直接在这里更新。
设计层面讲:
1、抽象类类比模板,继承父类的子类们,你们至少都有了父亲的基因,还可以自己扩张,发展自己的个性
接口更像是一种协议(约定),实现接口的子类都有自己的具体实现,但是都得遵守这个约定,譬如入参,返回等等
2、抽象类表示一种A是B的关系;接口表示的是一种A有B的行为,书中最常用的描述,is-a 和 like-a的关系
语法层面:
1、抽象类的成员变量可以是多种类型,接口的成员变量都是public static final的
因此开发中常常会写一个interface把一些常量丢进去,顺便说一句,static代表只有一份,final才代表常量
什么意思呢?static意思是说这个东西是属于类的,而不是属于类的实例的,
final修饰的,在编译期就会丢进这个类的常量池。关于class文件的组成以及类的加载在《深入理解java虚拟机》中讲的
非常细致,有时间我也写一篇总结下
2、抽象类可以有方法的实现,接口中只能有抽象方法(默认public abstract)
且慢,且慢,笔者最近看的java8的新特性,感觉世界没有秩序了,java也不再有秩序,因为新特性说了,接口中也能有
方法的实现了,只要加一个default方法签名,叫默认方法,实现类可以默认继承,也可以覆盖掉。
3、抽象类中允许有静态代码块和静态方法,接口不能
看到上面一条的java8"例外",你可能又要注意了,新特性还说加了static修饰的方法,实现类都不用实现了。问题来了,
如果两个接口都有相同的static方法,现在一个类同时去实现这2个接口,那么这个类该去"继承"谁呢?太乱了。笔者的工作
中,目前还不敢着手这些新特性。
4、一个类只能继承一个抽象类(单继承),但可以实现多个接口(多继承)
这个没啥说的
补充一下:今天看到RunnableFuture的源码,发现一个大瓜:
public interface RunnableFuture<V> extends Runnable, Future<V> { /** * Sets this Future to the result of its computation * unless it has been cancelled. */ void run(); }
这个当初学的时候只知道java是单继承的,但是接口"竟然"可以extends多个接口