接口和抽象类的相同和区别
相同点:
1)都可以定义方法和属性。
2)都可以看做是一种特殊的类,它们被设计出来的目的,就是要让子类实现其中定义的抽象方法。
3)都可以不含有抽象方法。不含有抽象方法的接口可以作为一个标志(比如可序列化的接口Serializable)。
4)都不能被实例化。
5)实现了接口的类或者继承了抽象类的子类,都必须实现定义的 抽象方法。如果存在没有实现的方法,那么该类必须声明为抽象类。
6)都实现了多态。通过方法的动态解析特性,在运行时动态调用实现类的方法。
不同点:
1)继承。
接口可以多实现,但是接口只能继承接口。
但是抽象类只能单继承,但是抽象类可以继承普通类,也能继承抽象类。
2)方法。
抽象类方法的访问修饰符可以是任意的,并且方法可以是抽象的,也可以不是抽象的。
接口定义的方法默认是 public abstract
的(可以不用显示声明)
重点:在Java8中,接口新增了default
修饰的默认实现方法,和static
声明的静态方法。这两种方法不是抽象的。
关于default
方法 和 static
方法,接下来会细讲。
3)类变量。
抽象类变量可以有任意的变量修饰符。
接口的类变量默认并且强制是 public static final
。(可以不用显式声明)。实现类可以继承使用,但不能对接口变量覆盖。
4)静态方法和代码块。
抽象类可以有静态代码块,也可以有静态方法,静态方法访问修饰符也没有限制。
接口中不允许有静态代码块,接口静态方法默认并且强制是 public
的。并且静态方法不能被继承和实现。
5)构造器
抽象方法可以有构造器。
接口不能有构造器。
6)设计理念
抽象类:
对类的抽象。是对同一个类型下共有的特性抽象。是作为一系列子类的模板设计。一般用于定义一系列类的公有功能和操作。而留下抽象方法给子类,去实现子类独有的特性。
抽象类是一种 自下而上 的设计,先有了子类,然后提取子类公有的特性与行为,构成抽象类。
抽象类与子类是 is-a 关系,父类和派生的子类在概念上是相同的,存在的是父子关系,是一种重耦合。
接口:
对行为的抽象。它定义了一种规范,更多的是辐射类型的设计。一般用于延伸类的行为方式。
接口是一种 自上而下 的设计,先规定行为方法,然后由类去实现这些行为,就可以成为接口的实现类。
接口与实现类是 like-a 关系,接口与实现类的关系只是定义了行为,本质上并无实质关系,只是契约层面的关系。
总结如下:
比较 | 抽象类 | 接口 |
---|---|---|
默认方法 | 抽象类可以有默认的方法实现 | java 8之前,接口中不存在方法的实现. |
实现方式 | 子类使用extends关键字来继承抽象类.如果子类不是抽象类,子类需要提供抽象类中所声明方法的实现. | 子类使用implements来实现接口,需要提供接口中所有声明的实现. |
构造器 | 抽象类中可以有构造器, | 接口中不能 |
和正常类区别 | 抽象类不能被实例化 | 接口则是完全不同的类型 |
访问修饰符 | 抽象方法可以有public,protected和default等修饰 | 接口默认是public,不能使用其他修饰符 |
多继承 | 一个子类只能存在一个父类 | 一个子类可以存在多个接口 |
添加新方法 | 想抽象类中添加新方法,可以提供默认的实现,因此可以不修改子类现有的代码 | 如果往接口中添加新方法,则子类中需要实现该方法. |
作者:_Zy
链接:https://www.jianshu.com/p/76d45592f075
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。