抽象类和接口以及抽象类和接口的区别
1.抽象类
-
抽象类是:类和类之间有共同特征,将这些具有共同特征的类再进一步抽象形成抽象类。由于类本身是不存在的,所以抽象类无法创建对象。
-
类是:现实世界中不存在的,人类大脑思考总结的结果
-
对象是:现实世界中存在的
-
抽象类也属于引用数据类型
-
抽象类定义:
语法:[修饰符列表] abstract class 类名 {
类体;
}
-
抽象类是无法实例化的,无法创建对象,所以抽象类是用来被子类继承的
-
final和abstract不能联合使用,这两个关键字是对立的
-
抽象类的子类可以是抽象类,也可以是非抽象类
-
抽象类虽然无法实例化,但是抽象类有构造方法,这个构造方法是供子类使用的。
2.抽象方法
-
抽象方法表示没有实现的方法,没有方法体的方法。例如:
public abstract void doSome();
抽象方法特点是:1.没有方法体,以分号结尾;2.前面修饰符列表中有 abstract 关键字
-
抽象类中不一定有抽象方法,但是抽象方法必须出现在抽象类中
-
【重要】一个非抽象的类继承抽象类,必须将抽象类中的抽象方法进行覆盖/重写/实现。需要将从父类中继承过来的抽象方法进行覆盖/重写,或者也叫做“实现”
-
面向对象编程,不要面向具体编程,降低程序的耦合度,提高程序的扩展力,这种编程思想符合ocp原则
【判断题】Java语言中凡是没有方法体的方法都是抽象方法。
不对,Object类中就有很多方法都没有方法体,都是以“;”结尾的,但他们不是抽象方法。
3.接口
3.1 接口的基础语法
-
接口也是一种“引用数据类型”,编译之后也是一个class字节码文件
-
接口是完全抽象的。(抽象类是半抽象。)或者也可以说接口是特殊的抽象类。
-
接口的定义语法:
[修饰符列表] interface 接口名{
}
类:
[修饰符列表] class 类名{
}
抽象类
[修饰符列表] abstract class 类名{
}
-
接口支持多继承,一个接口可以继承多个接口
-
接口中只包含两部分内容,一部分是:常量。一部分是:抽象方法。接口中没有其它内容了,只有这两部分。
-
接口中所有的元素都是public修饰的,(都是公开的)
-
接口中的抽象方法定义时:public abstract 修饰符可以省略
-
接口中的方法都是抽象方法,所以接口中的方法没有方法体
-
接口中常量public static final 可以省略,访问常量的语法:接口名.
-
类和类之间叫做继承,类和接口之间叫做实现
继承使用extend关键字完成
实现使用implement关键字完成
-
==【重点】==当一个非抽象的类实现接口的话,必须将接口中所有的抽象方法全部实现(覆盖、重写)
-
一个类可以实现多个接口,为Java弥补了单继承的缺陷
-
接口A和接口B虽然没有继承关系,但是写代码的时候,可以互转,编译器没有意见。但是运行时可能出现错误。最终需要加:instanceof运算符进行判断。向下转型养成好习惯,转型之前先if+instanceof 进行判断
-
接口通常提取的是行为动作
-
接口和实现都存在的话:extend 关键字在前;implements 关键字在后
-
使用接口写代码的时候,可以使用多态(父类型引用指向子类型对象)
3.2接口在开发中的作用
-
接口在开发中的作用,类似于多态在开发中的作用。
多态:面向抽象编程,不要面向具体编程。降低程序的耦合度,提高程序的扩展力。
-
Customer has a FoodMenu,但凡是满足has a 的表示都以属性的形式存在
Cat is a Animal,但凡满足 is a 的表示都可以设置为继承
-
面向接口编程,可以降低程序的耦合度,提高程序的扩展力,符合ocp开发原则。
接口的使用离不开多态机制。(接口 + 多态才可以达到降低耦合度)
-
接口可以解耦合,任何接口都有调用者和实现者,接口可以将调用者和实现者解耦合,调用者面向接口调用,实现者面向接口实现
4.类型与类型之间的关系
is a , has a , like a
is a:
Cat is a Animal(猫是一个动物)
凡是能够满足 is a 的表示“继承关系”
has a :
I has a Pen (我有一支笔)
凡是能够满足 has a 关系的表示“关联关系”
关联关系通常以“属性”的形式存在
like a :
Cooker like a FoodMenu(厨师像一个菜单一样)
凡是能够满足 like a 关系的表示“实现关系”
实现关系通常是:类实现接口。
5.抽象类和接口的区别
- 抽象类是半抽象的,接口是完全抽象的
- 抽象类中有构造方法,接口中没有构造方法
- 类和类之间只能单继承,接口和接口之间支持多继承
- 一个类可以同时实现多个接口,一个抽象类只能继承一个类(单继承)
- 接口中只允许出现常量和抽象方法