抽象类和接口
Posted lllliuxiaoxia
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了抽象类和接口相关的知识,希望对你有一定的参考价值。
参考:
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接口包含的内容
常量
格式:
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修饰)
其他
必须通过实现类,来实现接口,实现类需要重写接口中所有抽象方法,只要有一个未重写,那么这个实现类自己就必须是抽象类。
以上是关于抽象类和接口的主要内容,如果未能解决你的问题,请参考以下文章