面试必问系列:9、【转载】接口和抽象类的区别是什么?

接口和抽象类的相同和区别

相同点:

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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值