抽象类和接口的区别
抽象类
抽象方法:
使用abstract修饰的方法,但是没有方法体(没有{ }),只有方法声明,抽象方法强制子类覆写。
一旦一个类有了抽象方法,那么该类也必须声明为抽象类;抽象方法必须属于抽象类,但是抽象类可以没有抽象方法。
抽象类不能实例化,不能创建对象(不能new,但是可以super)。
抽象类必须得有子类,自己的功能才能得以运行;
抽象类的方法只是定义了子类应该具备的行为,但是没有给出怎么去完成行为的功能代码;
交给子类去根据自身特殊情况去完成该父类申明的功能。
抽象方法也称为: 钩子方法; 回调方法。
抽象类里可以有普通方法;
抽象类是类的一种特殊情况,具有类的一切特点,但是不能实例化;一般的都得带有抽象方法。
思考:
1.抽象类能使用final修饰吗?不能
2.抽象类可以定义构造方法吗?能
接口
interface定义:
1.接口定义一种规范,规定一个类必须做什么,但他不管如何具体去做;
2.[修饰符]interface 接口名 extends 父接口1,父接口2....
(1)没有构造方法,不能实例化;
(2)接口只能继承接口,不能继承类;
(3)接口里没有普通方法,方法全是抽象的;
(4)接口里的方法默认修饰符是public abstract;
(5)接口里的字段全是全局常量,默认修饰符是public static final
3.接口里的成员包括(主要是前两个):
(1)全局常量
(2)公共的抽象方法
(3)内部类(包括内部类,内部接口,内部枚举类)
使用接口(支持多实现)
1.[修饰符] class 类名 implents 接口1,接口2...;
2.接口的实现必须在extends之后;
3.实现接口的方法必须是public类型;
4.接口不能创建实例,但是可以声明引用类型的变量。
(1)此时,引用类型的变量必须指向到其实现类对象。
(2)IStudent s = new String();
(3)IStudent s = new StudentImpl();
接口和抽象类
相同点:
1.都位于继承的顶端,用于被其他实现或者继承;
2.都不能实例化;
3.都包含抽象接口,其子方法都必须覆写这些抽象方法。
区别:
1.抽象类为部分方法提供实现,避免子类重复实现这些方法,提供代码重用性;接口只能包含抽象方法;
2.一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口;(接口弥补了java的单继承)。
二者的选用:
1.优先选用接口,尽量少用抽象类;
2.需要定义子类的行为,又要为子类提供共性功能时才选用抽象类。
抽象类和接口的区别
比较 | 抽象类 | 接口 |
关键字 | 使用abstract class声明 | 使用interface声明 |
定义 | 包含一个抽象方法的类 | 抽象方法和全局常量的集合 |
组成 | 属性、方法、构造、常量、抽象方法 | 全局常量、抽象方法 |
权限 | 抽象方法的权限可以任意 | 只能是public权限 |
使用 | 通过extends关键字继承抽象类 | 通过implements关键字实现接口 |
局限 | 抽象类存在单继承局限 | 没有此局限,一个子类可以实现多个接口 |
顺序 | 一个子类只能先继承抽象类在实现多个接口 | |
设计模式 | 模板设计 | 工厂设计、代理设计 |
两者联合可以完成一个设配器设计 | ||
实际作用 | 只能做一个模板使用 | 作为标准、表示能力 |
使用 | 两者没有什么本质的区别,但是从实际上来看,如果一个程序中抽象类和接口都可以使用的话,则一定要优先考虑接口,因为接口可以避免单继承所带来的局限。 | |
实例化 | 都是依靠对象多态性,通过子类进行对象实例化的 |