Java|Java 抽象类和接口

目录 1??什么是抽象类?
注意事项
抽象类的使用场景
特征和注意事项
final和abstract是什么关系?
2??接口的定义与特点
接口的用法
接口和接口的关系
接口多继承的作用
接口的注意事项
3??抽象类和接口区别
4??抽象类和接口的共同点

1??什么是抽象类? ?在Java中abstract是抽象的意思,可以修饰类、成员方法。
abstract修饰类,这个类就是抽象类;abstract修饰方法,这个方法就是抽象方法。
注意事项

  • 抽象方法只有方法签名,不能声明方法体。
  • 一个类中如果定义了抽象方法,这个类必须声明成抽象类,否则会报错。
抽象类的使用场景
  • 抽象类可以理解成不完整的设计图,一般作为父类,让子类来继承。
  • 当父类知道子类一定要完成某些行为,但是每个子类该行为的实现又不同,于是该父类就把该行为定义成抽象方法的形式,具体实现交给子类去完成。此时这个类就可以声明成抽象类。
特征和注意事项
  1. 一个类只能继承一个抽象类
  2. 修饰符不能是private(因为要被继承)
  3. 类拥有的成员(如:成员变量、方法、构造器),抽象类也都具备
  4. 抽象类中不一定有抽象方法,但有抽象方法的类一定是抽象类
  5. 一个类继承了抽象类,就必须重写抽象类的全部抽象方法,否则这个类也必须定义成抽象类。
  6. 不能用abstract修饰变量、代码块、构造器。
  7. 最重要的特征:抽象类虽然得到了抽象方法,但是失去了创建对象的能力 【即:不能用来实例化对象,所以抽象类必须被继承才能被使用,其他的功能和普通类相同】
为什么抽象类不能创建对象呢?
可以用反证法来验证,假设抽象类可以创建对象,但是在调用方法时就会报错,因为调用的方法连方法体都没有!因此抽象类不能创建对象
final和abstract是什么关系? 答案是互斥关系。
原因主要有以下两个方面:
  • abstract定义的抽象类作为模板让子类继承,final定义的类不能被继承
  • 抽象方法定义通用功能让子类重写,final定义的方法子类不能重写。
2??接口的定义与特点 接口的格式如下:
Java|Java 抽象类和接口
文章图片

  • JDK1.8之前接口中只能定义抽象方法和常量,没有其他成分
  • 接口不能实例化
  • 接口是一种规范
  • 由于接口体现的是规范思想,规范默认都是公开的,所以接口中的成员都是public修饰的,也可以省略不写
接口中的变量默认用public static final修饰
接口中方法默认用public abstract修饰
接口的用法 接口是用来被类实现(implements)的,实现接口的类称为实现类。实现类可以理解成所谓的子类。
接口可以被类单实现,也可以被类多实现。
接口和接口的关系 类和类的关系:单继承。
类和接口的关系:多实现。
接口和接口的关系:多继承,一个接口可以同时继承多个接口。
接口多继承的作用 规范合并,整合多个接口为同一个接口,便于子类实现。
即:在开发设计的过程中,一个类同时实现多个接口,看起来比较繁琐
因此就有了如下设计:
让一个接口A继承多个接口,然后再由类实现接口A就可以了
接口的注意事项 1.接口中所有的方法不能有具体的实现,即接口中的方法都是抽象方法。
2.接口必须通过类来实现它的抽象方法
3.接口不能创建对象
【Java|Java 抽象类和接口】4.一个类实现多个接口,多个接口中有同样的静态方法时不冲突
【原因是:接口中的方法只能接口自己调用】
5.一个类继承了父类,同时又实现了接口,当父类中和接口中有同名方法时,默认用父类的。
举个例子:
public class text4 { public static void main(String[] args) { Cat cat=new Cat(); cat.eat(); } } class Animal{ public void eat(){ System.out.println("父类中的eat方法"); } }interfaceFood{ default void eat(){//使用default修饰的接口方法,可以拥有方法体,实现类不需要重写,可以被实现类继承,该特性是Java8以后被提出 System.out.println("接口中的eat方法"); } } class Cat extends Animal implements Food {}

运行结果:
Java|Java 抽象类和接口
文章图片

3??抽象类和接口区别 从语法层面来说:
1、抽象类可以提供成员方法的实现细节,而接口中只能存在抽象方法
2、抽象类中成员变量可以是多种类型,接口中成员变量必须用public static final修饰
3、一个类只能继承一个抽象类,但可以实现多个接口
4、抽象类中允许含有静态代码块和静态方法,接口不能
从设计层面而言:
1.抽象类是对整一个类的属性,行为等方面进行抽象,而接口则是对行为抽象。就好比飞机和鸟,抽象类抽象出的是飞行物类。而接口则是抽闲出飞行方法。
2.抽象类是一个模板式的设计,当在开发过程中出现需求更改的情况,只需要更改抽象类而不需要更改它的子类。
接口是一种辐射性设计,当接口的内容发生改变时,需要同时对实现它的子类进行相应的修改。
4??抽象类和接口的共同点 接口和抽象类又很像,它们都具有如下共同的特征:
  • 接口和抽象类都不能被实例化,它们都位于继承树的顶端,用于被其他类实现和继承。
  • 接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。
?

    推荐阅读