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多个接口

 

posted @ 2018-08-28 13:34  鼠标的博客  阅读(125)  评论(0编辑  收藏  举报