上一节提及的是面向对象的几个特性,还有一个特性是抽象。
1 抽象类
把多个具有相同特征的类抽象出一个类,以这个抽象类作为子类模板,可以避免子类设计的随意性。
抽象类使用abstract关键字修饰,抽象的父类知道其子类应该包含怎样的方法但无法准确知道子类如何实现这些方法。
抽象类中的所有方法并不一定要是抽象的,你可以选择在抽象类中实现一些基本的方法。
2 接口
接口的由来:是因为对于继承而言,java只能实现单继承,但对于不同功能的类的方法有需要的时候。所以为了解决单继承问题,引入接口的概念。
也可以理解为一种特殊的类,由全局常量和公共抽象方法组成。定义了某一批类所需要遵守的规范,不关心类的内部数据,也不关心类的方法实现细节(不能有方法体),只规定这些类必须提供某些方法,使用interface关键字。
接口的使用:
修饰符 interface 接口名 [extends 父接口1,父接口2]{ //可以继承父类也可以不继承,两个关键字不能调换
//零个到多个常量定义
属性是常量即使不添加public static final,系统会自动添加
//零个到多个抽象方法定义
只能是抽象方法,定义时不加public abstract,系统自添
}
public interface SpeakHello {
void speakHello();
}
声明接口及其方法时都省略abstract关键字
接口就是用来被继承、被实现的,修饰符用public,不能使用private和protected
接口的实现:
一个类可以实现一个或多个接口,使用implement关键字。
比如:
public class Chinese implements SpeakHello {
@Override
public void speakHello() {
System.out.println("中国人习惯问候:你吃饭了吗");
}
}
1.如果父类实现某个接口,那么子类也自然实现该接口,子类不必再显式的使用关键字声明实现这个接口。
2.如果一个类声明实现一个接口,但没有重写接口中的所有方法,那么这个类必须是abstract类
接口的结构
那么我们由此可以得出它的基本使用结构:
interface A{ //接口声明
//抽象方法
}
class B implement A{//用B实现接口A}
class C implement A{//用C实现接口A}
接口回调
是指可以把实现某个接口的类创建的对象的引用赋给该接口声明的接口变量中,难么该接口就可以调用被类实现的接口方法
例如:
interface showMe{ //接口
void show(String s);
}
class TV implement showMe{ //TV实现接口
public void show(String s){
System.out.println(s);
}
}
pubilc class Main{
public static viod main(String args[]){
showMe sm=new TV(); //声明接口变量sm存放对象的引用
sm.show(“A牌电视机”); //接口回调
}
}
接口变量做参数
如果一个方法的参数是接口类型,我们可以将任何实现该接口的类的实例的引用传递给该接口,那么接口参数就可以回调类实现的接口方法。
这一点要记住,现在不理解没关系,后面看代码多了,再回来理解一下。
3 抽象类与接口的区别
一个类只能继承单个抽象类,但是可以实现多个接口;
接口强调特定功能的实现,而抽象类强调所属关系;
抽象类中的所有方法并不一定要是抽象的,你可以选择在抽象类中实现一些基本的方法;
而接口要求所有的方法都必须是抽象的;
4 使用抽象模式与接口模式
后续编码中会遇到这两种分开或结合的使用。
比如代码中多个类继承某个抽象类,实现某个接口,从而实现相关功能。
抽象类与接口也帮助我们代码定下一个便于日后扩展功能的基本架构。
理解这两个有助于后面阅读代码与运用一些重要的框架。
PS:支付宝搜“654656370”可领红包。