一、释义
关于定义,网络或者书籍中有相当多的解释和描述,这边只用形象的说法来解释,易于理解最重要。
1、抽象类
简单的说,抽象类就是对对象的抽象,用于进行类型隐藏。如:小狗、小猫都属于宠物,都会叫,要吃和睡。这时,我们要定义类的话:
最原始的方法,就是写两个类。但是很多东西是重复的,暂先不考虑多态的使用。这时,我们把相同的东西做一个抽象,小狗小猫都属于宠物,那么就做一个父类Pet,操作相同则可以抽象出来,操作和内容都相同的部分,则可以在抽象类中定义为一种默认操作:
这样我们的代码更加精简,而且使用起来更加灵活(能够支持多态):
2、接口
接口则是一种行为规范,接口中只包含各种行为的方法声明,而不写具体方法体,各类都需要写自己的方法体,都具有不同的实现。接口是一种特殊形式的抽象类:
二、两者差异比较
他们都是对象的抽象,只不过接口比抽象类更加抽象。
1、相同点
1)都不能被实例化;
2)都能包含抽象方法(接口中的方法都默认是抽象方法,抽象类中则需要声明为抽象方法,两者都只能声明,不能包含方法体);
2、区别
接口:
1)表现一种实现关系(implements),“like a ”,只是一种契约规范;
2)多实现,一个类可以实现多个接口;
3)成员变量默认都是static final的,方法默认都是抽象的(abstract);
4)实现类需要实现接口中的所有方法;
抽象类:
1)表现的是继承关系(extends),“is a”,要求派生类和父类在概念本质上是相同的;
2)单一继承,一个类只能继承一个抽象类(另:接口是可以继承多个类的);
3)成员变量和方法都可以自己声明各自的修饰符;
4)抽象(abstract)方法派生类必须继承,其他方法则可以作为一种默认操作,也可以派生类自己重写父类方法;
三、使用场景差异
通过以上的解释与比对,可以看到:
接口是一种极其抽象的契约规范,大家都可以服从某种规范,但是不一定要全部一样;
抽象类则是类的抽象,可以包含抽象方法声明(子类必须自己写方法体);也可以有具体的方法操作(视为一种默认操作),当然子类可以对此方法进行重写。
也就是说,抽象类更容易被扩展(可以方便的在抽象类中增加默认操作,而不需要修改子类),是类和接口之间的一个桥梁,融合了两者的优点。
另:本文代码之所以均通过截图展示,其一,方便做标识处理;其二,希望大家在学习时,能自己设计相应场景,编写代码,辅助理解。
菜鸟一枚,难免有错,敬请指正,共同进步!