抽象类和接口

参考:
https://blog.csdn.net/aptentity/article/details/68942916
https://blog.csdn.net/jason_lh1024/article/details/97388038
https://blog.csdn.net/tracydragonlxy/article/details/78082600
https://blog.csdn.net/h294590501/article/details/80303722
李刚《Java疯狂讲义》

相同点

  • 都不能被实例化
  • 都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法

不同点

接口作为系统和外界交互的窗口,接口体现的是一种规范。对于接口的使用者而言,接口规定了使用者必须向外提供哪些方法(以方法的形式来提供),对于接口的调用者而言,接口规定了调用者可以调用哪些服务,以及如何调用这些服务(就是如何调用方法)。接口类似整个系统的总纲,制定了系统各模块应该遵循的标准。

抽象类作为系统中多个子类的共同父类,它所体现的是一种模板式设计,抽象类作为多个子类的抽象父类,可以被当作系统实现过程中的中间产品。

其他具体不同点体现:

  • 接口里只能包含抽象方法、静态方法、默认方法和私有方法,不能为普通方法提供方法实现;抽象类可以包含普通方法;
  • 抽象接口里只能定义静态常量,不能定义普通成员变量;抽象类里都可以定义;
  • 接口里不包含构造器;抽象类里可以有构造器,但是抽象类的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作;
  • 一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口,通过多个接口可以弥补Java单继承的不足

java9接口包含的内容

Java不同版本接口内容的变化情况

常量

格式:

public static final 数据类型 常量名称 = 数据值;

注: 一旦使用final关键字进行修饰,说明不可改变。

注意事项;

1.接口当中的常量,可以省略public static final ,注意:不写也照样表达这个意思。

2.接口当中的常量,必须进行赋值:不能不赋值。

3.接口中常量的名称,使用完全大写的字母,用下划线进行分隔。(推荐这种命名规则)

抽象方法

方法前面如果没有修饰符,默认为public abstract

默认方法

  • JDK8 中为什么有接口默认方法
    以前创建了一个接口,并且已经被大量的类实现。
    如果需要再扩充这个接口的功能加新的方法,就会导致所有已经实现的子类需要重写这个方法。
    如果在接口中使用默认方法就不会有这个问题。
    所以从 JDK8 开始新加了接口默认方法,便于接口的扩展。
  • 接口中默认方法的规则
    1.默认方法使用 default 关键字,一个接口中可以有多个默认方法。
    2.接口中既可以定义抽象方法,又可以定义默认方法,默认方法不是抽象方法。
    3.子类实现接口的时候,可以直接调用接口中的默认方法,即继承了接口中的默认方法。
    4.接口中同时还可以定义静态方法,静态方法通过接口名调用。

静态方法

私有方法

在Interface中编写私有方法时,我们应该遵循以下规则:

  • 我们应该使用私有修饰符(private)来定义这些方法。
  • 我们不能同时使用私有修饰符(private)和abstract来定义这些方法。
    • “私有”方法意味着完全实现的方法,因为子类不能继承并覆盖此方法。
    • “抽象”方法意味着无实现方法。这里子类应该继承并覆盖此方法。
  • 私有方法必须包含方法体,必须是具体方法。
  • 这些接口私有方法仅在该接口内是有用的或可访问的。我们无法从接口访问或继承私有方法到另一个接口或类。

一般建议

一般在接口中的方法和属性不要加任何修饰符号(public也不要加),尽量不要在接口里定义变量,如果一定要定义变量,肯定是与接口方法相关,并且是整个应用的基础常量(阿里巴巴开发规范)。即接口中一般使用静态常量(实际由public static final修饰)和抽象方法(实际由public abstract修饰)

其他

必须通过实现类,来实现接口,实现类需要重写接口中所有抽象方法,只要有一个未重写,那么这个实现类自己就必须是抽象类。

原文地址:https://www.cnblogs.com/lllliuxiaoxia/p/12287859.html