创作不易,如果觉得这篇文章对你有帮助,欢迎各位老铁点个赞呗,您的支持是我创作的最大动力!
Java中抽象类与接口
Java中抽象类
-
抽象类的定义
定义:
类的修饰符 abstract class 类名
抽象类跟普通的类定义相比,就是在原来的基础上,加上一个abstract关键字。Java语言中,用abstract 关键字来修饰一个类时,这个类叫作抽象类。抽象类是它的所有子类的公共属性的集合,是包含一个或多个抽象方法的类。抽象类可以看作是对类的进一步抽象。在面向对象领域,抽象类主要用来进行类型隐藏。(摘自百度百科)
-
为什么需要定义抽象类,而不是普通的类
如果一个类,我们通常不会实例化,而且含了一些公共的属性和方法,我们就可以把它定义成抽象的。比如说人,就可以定义为抽象类Person。
-
抽象类使用总结:
1、在Java中使用
abstract
关键字定义的类就是抽象类,采用abstract关键字定义的方法就是抽象方法。
2、抽象类是不能被实例化的,就像现实世界中的人,其实是抽象的,张三才是具体的人的一个实例。
3、抽象的方法只需在抽象类中,提供声明。抽象类中的抽象方法只有方法体,不需要在抽象类中进行实现。
4、如果一个类中含有抽象方法,那么这个类必须定义成抽象类,当然,抽象类中,可以没有抽象方法。
5、如果一个子类继承了抽象类,那么,抽象类中的所有的抽象方法必须被子类复写。如果在子类中不复写该抽象方法,那么必须将此方法声明为抽象方法。
6、抽象类不能被final修饰,因为抽象类就是用来被继承的,而final修饰后的类,不能被继承,两者有冲突。
7、抽象方法不能被final修饰,因为抽象方法就是用来被子类实现的,而final修饰的方法不能被覆盖,这和final有冲突。
8、在抽象类中,我们可以将一些公共的属性变量放到抽象类中,也可以包含一些公用方法的实现。当然啦,抽象类使用的重要意义在于
:在抽象类中,我们可以定义一些抽象的方法,这样就会存在一个约束,而子类必须实现我们定义的方法,抽象类中的方法名称,子类又不能修改,这样就能很好的实现多态的机制,有了多态的机制,我们在运行期就可以动态的调用子类的方法。从而在运行期可以灵活的互换实现。
Java中接口
-
接口定义:
Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。(摘自百度百科)这里的接口有两种含义:
1、Java接口,Java语言中存在的结构,有特定的语法和结构;
2、一个类所具有的方法的特征集合,是一种逻辑上的抽象。前者叫做“Java接口”,后者叫做“接口”。 -
接口使用总结:
1、在Java中,接口使用
interface
声明类。
2、接口可以看作是抽象类的一种特殊情况,在接口中只能定义抽象的方法和变量。
3、接口中的方法,只能由子类通过implements
关键字来实现。
4、接口中的变量默认都是public static final
类型的,不能更改,所以必须显示的初始化。
5、接口中的方法默认都是public abstract
的,方法的定义格式不能更改。
6、接口不能被实例化,另外,接口中没有构造函数的概念。
7、接口之间可以继承,但接口之间不能实现。
8、如果一个类实现了接口,那么这个子类,必须实现接口中所有的方法。
9、接口相比较类而言,类只能单继承,而接口可以多实现。
接口和抽象类的区别
-
共同点:
a) 接口和抽象类都不能被实例化
b) 抽象类和接口都是用来抽象具体对象的,要面向接口(抽象)编程,而不要面向具体编程。虽然都进行了不同程度的抽象,但是接口的抽象级别最高。
-
不同点:
a) 抽象类要被子类继承,而接口是用来被子类实现的。
b) 接口只能做方法声明,不能有方法的实现(接口默认方法实现除外),抽象类中不仅可以作方法声明,也可以做方法实现。
c) 实现接口的关键字为
implements
,继承抽象类的关键字为extends
。一个类可以实现多个接口,但一个类只能继承一个抽象类。接口一方面解决java的单继承问题,另一方面,实现了强大的可插拔性(多态机制)。d) 抽象类可以有抽象方法、具体的方法和属性,而接口只能有抽象方法和不可变常量。接口里定义的变量只能是公共的静态的常量(
public static final
),抽象类中的变量是普通变量。e) 接口是设计的结果,抽象类是重构的结果。抽象类主要用来抽象类别,强调的是所属关系,接口主要用来抽象功能,强调的是特定功能的实现。
-
使用总结
a) 抽象类的存在主要是可以把公共的代码移植到抽象类中。
b) 使用时,优先选择接口(因为继承抽象类后,此类将无法再继承,所以会丧失此类的灵活性)
接口与抽象类的异同点(面试用)
相同点
- 都可以定义抽象方法
- 都不能实例化对象
- 定义的抽象方法都需要被重写
- 都可以定义public static方法,public static final常量(接口中一般不这么用)
不同点
- 意义不同
抽象类是对事物更高层级的抽象
接口是对功能的封装 - 定义方式不同
抽象类用 abstract class定义
接口用interface定义 - 内容不同
抽象类中除了抽象方法外,还可以定义构造方法等普通类中定义的所有成员
接口不能定义构造方法 - 使用方式不同
抽象类需要被子类extends
继承
接口需要被实现类implements
实现 - 类只支持单继承,接口支持多实现
- 应用场景不同
一般情况下,对类进行功能的扩展,优先选择接口
除了扩展功能外,还需要保存不同的数据,只能选择抽象类。抽象类的抽象方法需要子类重写,抽象类还可以约束所有的子类都具有相同的功能。
注:
上文中接口不能有方法的实现,其实说的不是很严谨,在JDK1.8之后,在接口里面可以定义default方法,default方法里面是可以具备方法体的,当子类实现该接口之后,不需要重写该方法即可以调用该方法
public interface Test {
/**
* <p>
*
* <p/>
*
* @param
* @return void
* @Date 2021/10/3 17:53
*/
default void getCustomerInfo(){
}
void test();
}
写博客是为了记住自己容易忘记的东西,另外也是对自己工作的总结,希望尽自己的努力,做到更好,大家一起努力进步!
如果有什么问题,欢迎大家一起探讨,代码如有问题,欢迎各位大神指正!
给自己的梦想添加一双翅膀,让它可以在天空中自由自在的飞翔!