JAVA 基础重构 五 (抽象类和接口)

本文对比了抽象类和接口在Java中的使用场景和特性,详细分析了它们在默认方法实现、实现方式、构造器、多继承、速度及设计层面的区别。同时介绍了JDK8中接口的默认方法和静态方法如何减少了抽象类和接口之间的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.抽象类和接口的比较

参数抽象类接口
默认的方法实现可以有默认的方法实现完全抽象,根本不存在方法的实现
实现方式

子类用extends关键字来继承抽象类,如果子类不是抽象类的话,它需要实现父级抽象类中所有抽象方法,父类中非抽象方法可重写也可不重写

子类用implements去实现接口,需要实现接口中所有方法
构造器抽象类可以有构造器(构造器不能用abstract修饰)接口不能有构造器
与正常Java类的区别正常Java类可被实例化,抽象类不能被实例化接口和正常java类是不同的类型
访问修饰符抽象方法可以用public、protected、default修饰接口默认是public、不能用别的修饰符去修饰
main方法抽象类中可以有main方法,可以运行它接口中不能有main方法,因此不能运行它
多继承抽象类可继承一个类和实现多个接口接口只能继承一个或者多个接口
速度抽象类比接口速度快接口稍微慢点,因为它需要去寻找类中实现的它的方法
添加新方法如果在抽象类中添加新非abstract的方法,可以直接添加,因为非abstract方法无需在子类中实现,如果是abstact方法,则需要改变子类的代码,也要实现这个方法只要在接口中添加方法,实现它的类就要改变,去实现这个新添加的方法

2.设计层面上的区别

  a. 抽象类是对一种事务的抽象,是对整个类进行抽象,包括属性,行为(方法)。接口是对行为(行为)的抽象。如果一个类继承或实现了某个抽象类,那么一定是抽象类的种类(拥有同一种属性或行为的类)。

  b. 设计层面不同,抽象类作为很多子类的父类,是一种模板设计,而接口是一种规范,它是一种辐射式设计,也就是说对于抽象类,如果需要添加新的方法,可以直接在抽象方法中添加实现,子类可以不用变更,

   而对于接口不行,如果接口进行了变更,那么实现它的类都需要做变更。

2.2 接口和抽象类分别在什么时候使用

  a. 如果拥有一些方法,并想让他们中的一些有默认的具体实现,请选择抽象类

  b. 如果想实现多重继承,那么请使用接口,由于java不支持多继承,子类不能继承多个类,但一个类可以实现多个接口,因此可以使用接口来解决。

  c. 如果基本功能在不断变化,那么就使用抽象类,如果使用接口,那么每次变更都需要相应的去改变实现该接口的所有类。

2.3 JDK8 中接口的默认方法和静态方法

  JDK8中,Oracle引入默认方法和静态方法,用来减少抽象类和接口的差异,可以在接口中提供默认的实现方法并实现该接口的类不用强制去实现这个方法。JDK8中接口的静态方法只能通过接口名直接去调用,接口中的默认方法因为不是abstract的,所以可重写,也可以不重写。

微信公众号:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值