Java篇—抽象类和接口的区别(干货)

一、抽象类

关键字abstract修饰的类叫做抽象类。

就是比如我们熟悉的泰迪,哈巴,二哈,阿拉斯加,秋田犬等等大小形态有很大区别,我们怎么把他们抽象一下呢?那就是他们都有一些本质上相同的东西那就是他们都是狗,是狗就有耳朵,尾巴,四肢等等我们把这些给抽象出来,至于耳朵是啥样的,尾巴是长是短,颜色是啥,这就需要子类实现狗这个抽象方法了。

关键字abstract说明:    

1.abstract修饰的类为抽象类,此类不能有对象,(无法对此类进行实例化,说白了就是不能new);

2.abstract修饰的方法为抽象方法,此方法不能有方法体(就是什么内容不能有,在方法后面加一个大括号而里面什么都不写也是不行的);

抽象类知识get:

 1.抽象类不能有对象,不能用new此关键字来创建抽象类的对象;

 2.有抽象方法的类一定是抽象类,但是抽象类中不一定有抽象方法;

 3.抽象类中的抽象方法必须在子类中被重写。

抽象类的作用:

1.用于隐藏

对对象的具体类型进行隐藏,我们可以构造出一个固定的一组行为的抽象描述,一个行为可以有任意个可能的具体实现方式。这个抽象的描述就是抽象类。(多态)

2.用于拓展对象的行为功能

这一组任意个可能的具体实现表现为所有可能的子类,模块可以操作一个抽象类,由于模块依赖于一个固定的抽象类,那么他是不允许修改的。同时通过这个抽象类进行派生,拓展此模块的行为功能。(开放闭合原则)

思考题:抽象类不能被“new”,抽象方法必须重写,那么定义它们做什么?

答:抽象类生来就注定它是要被继承的,如果没有任何一个类去继承它的话,那么也就失去了它的意义;抽象方法生来就是要被重写的,而且是必须重写。(只要继承了某个抽象类,就必须去重写此抽象类中含有的抽象方法)

二、接口

接口就是一个规范和抽象类比较相似。它只管做什么,不管怎么做。通俗的讲,借口就是某个事物对外提供的一些功能的声明,其定义和类比较相似,只不过是通过interface关键字来完成。

接口知识get:

1.接口中的所有属性默认为:public static final ****(属性不能够被更改);

2.接口中的所有方法默认为:public abstract ****(方法默认为抽象方法,实现类必须去重写接口中的方法);

3.接口不再像类一样用关键字 extends去“继承”,而是用 implements 去“实现”,也就是说类和接口的关系叫做实现,(例如:A类实现了B接口,那么称A为B接口的实现类。而类与类之间的继承的话,叫做A类继承了B类,其中B类为A类的父类(基类),A类为B类的子类(派生类))。实现接口与类的继承比较相似。    

接口的作用:

1.由于Java单继承的原因,所以需要曲线救国,接口是作为继承关系的一个补充。

2.把程序模块进行固化的契约,降低偶合。把若干功能拆分出来,按照契约来进行实现和依赖。(依赖倒置原则)

3.定义接口有利于代码的规范。(接口分离原则)

三、抽象类和接口的异同

接口和抽象类相同点:

1.都不能被实例化;

2.接口的实现类和抽象类的子类只有全部实现了接口或者抽象类中的方法后才可以被实例化。

接口和抽象类的区别:

1.接口只能定义抽象方法不能实现方法,抽象类既可以定义抽象方法,也可以实现方法;

2.单继承,多实现。接口可以实现多个,只能继承一个抽象类;

3.接口强调的是功能,抽象类强调的是所属关系;

4.接口中的所有成员变量 为public static final, 静态不可修改,当然必须初始化。接口中的所有方法都是public abstract 公开抽象的。而且不能有构造方法。抽象类就比较自由了,和普通的类差不多,可以有抽象方法也可以没有,可以有正常的方法,也可以没有;

5.abstract class 表示的是is a关系(是不是这个对象的一种),interface表示的是like a关系(有没有这个功能)。
抽象类强调的是从属关系,接口强调的是功能。

福利来了,抽象类和接口精心绘制图解

Java篇—抽象类和接口的区别(干货)_第1张图片

 

 

 

 

你可能感兴趣的:(学习历程)