JAVA中的抽象类和接口

JAVA中抽象类和接口

       java中定义类的过程就是抽象和封装的过程,而接口与抽象类则是对实体类进行更高层次的抽象。他们都是仅仅定义公共行为和特征。

接口与抽象类的共同点是都不能被实例化,但可以定义引用变量指向实例化对象。

下面是接口与抽象类的区别。

关键字的定义:抽象类是用abstract,接口使用interface。
关于方法的实现,抽象类中可以有方法的实现,在接口中只能对方法定义,但是不能有方法的实现,但是在JDK8版本以后,允许有default关键字实现。
方法访问控制:抽象类无限制,接口中有限制,默认是public abstract。
在抽象类中可以有静态方法,但是在接口中不能有,但是在JDK8版本以后允许有静态方法。
抽象类可以单继承接口可以多继承。
关于static静态代码块,抽象类中可以有接,接口中不能有。
抽象类在被继承时体现的是一is a关系,接口在实现时体现的是can do 关系

与接口相比,抽象类通常是对同类事物相对具体的抽象,通常包含抽象方法,实体方法,属性变量,如果一个抽象类内只有一个抽象的方法,那么它就等同于一个接口。

抽象类的中的 is a关系需要符合里氏代换原则。

        什么是里氏代换原则呢?在这里简单的理解就是任何父类能够出现的地方之类都能够出现。比如打个比方。警察在枪战中经常说放下武器,把手举起来,而面对着对面的匪徒手里面有使用手枪的,也有使用匕首的,这些都是武器的子类,当父类出现时也就是武器出现时,在这里指的是说放下武器的时候,那么放下手枪是对的,放下匕首他也是对的。
在实际代码环境中,如果父类引用直接使用子类引用来代替,可以编译正常并执行,输出结果符合此类场景的预期,那么说明两个类之间符合里氏代换原则。

那什么是接口的can do关系呢?
举个简单的例子就是说,飞机能飞,鸟也能飞,应该把这个方法定义成一个接口,然后让飞机和鸟去实现它,而不是把飞这个方法放在某个抽象类中,再用飞机和鸟利用is a关系去继承抽象类,因为严格意义上讲,除了飞这个行为外,在飞机和鸟之间很难找到他们共同的特征。

java中的继承采用的是单继承,但是可以多实现。

关于定义成抽象类还是接口?

当你在编程的时候纠结定义接口还是抽象类的时候,这个时候推荐优先定义为接口,在程序设计的时候遵循接口的一些原则,然后按某种维度划分成多个接口,然后再用抽象类去实现某些接口,这样做的目的是方便后续的扩展和重构,增强程序的可扩展性和重构性。

 

 

++++++++++

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值