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的,所以可重写,也可以不重写。
微信公众号: