高级特性部分:
抽象(abstract)
接口(interface)
提纲:
抽象类的定义和使用
模板设计模式的使用
接口的定义和使用
回调函数
区别抽象类和接口的异同
软件设计原则
---------------------------------------------------------------------
抽象类
定义:
public abstract class XXX{
//1.抽象类中可以有构造方法,但是抽象类不能够被实例化
//2.抽象类中可以普通属性
//3.抽像类中可以有普通方法
//4.抽象类中可以定义抽象方法
//->就是指没有方法体的方法,没有实现了的方法
->
public abstract void method();
}
注意点:
1.抽象类也是支持继承的,但是也是仅支持单继承
2.抽象类当中可以不提供抽象方法,但是如果一个类当中提供了抽象
方法,那么这个类必然是抽象类
3.如果一个子类继承了某个抽象父类,那么这个子类必须全部实现父类当中
的所有的抽象方法!!!除非这个子类本身也是抽象类
4.抽象类也是一种抽象的数据类型,编译之后也是.class文件
不能够一起混用的修饰符:
访问修饰符:public protected [] private
其他修饰符:static final abstract
1.abstract和final能否一起修饰类或者方法?不能
答:抽象类天生就是用来被子类继承的,但是final修饰的类是不能够被子类来继承的
抽象方法天生被子类重写的,final修饰的方法是不能被子类来重写的
2.private和abstract不能
3.static和abstract 不能
static虽然是允许手动重写,但是static不具有多态
而abstract就是为了多态!!!
----------------------------------------------------------------------------------------------------------------------
应用-模板设计模式
应用场景:某些业务在全局来看,有一些相对比较稳定的业务流程,
但是其中又有很多变化的细节!!!
步骤:
1.定义一个抽象类,里面提供若干个用来执行业务流程的一些
抽象方法-具体的细节延迟到子类当中去实现
2.定义一个公开的final的用来执行“顶级业务”的方法
里面调用上面定义好了的抽象方法
public abstract class 演小品{
//1......
//具体的实现延迟到子类当中去
public abstract void 报幕();
public abstract void 出场();
public abstract void 搞笑();
public abstract void 散场();
//2.....
public final void method(){
报幕();
出场();
搞笑();
散场();
}
}
public class 宋小宝 extends 演小品{
....
}
public class 宋大宝 extends 演小品{
....
}
--------------------------------------------------------------------------
接口(interface):
作用:制定契约,
真正可以屏蔽底层的实现
支持多继承,用来拓展
中央气象局<->天气预报
=>腾讯
=>UC浏览器
关键字
定义一个接口
接口经过编译之后,也是一个.class文件
public interface 接口名{//一般以I开头或者以able结尾
//1.接口同样也是一种抽象的数据类型
//2.接口中不能有构造方法
//3.接口中的属性都是公开的静态的常量属性
//public static final int CAR = 0;
->可以简写:
//public int CAR = 0;
int CAR = 0;
//4.接口中的方法都是公开的抽象的方法
//public abstract void method();
//可以简写成
void method();
}
子类->父类 继承extends
实现类->接口 实现implements
注意点:
1.一个类可以去实现多个接口,多个接口之间用,隔开
2.一个接口也可以去继承多个接口,多个接口之间也是用,隔开
3.如果一个类实现了某个接口,那么它必须要实现接口当中的所有的方法
除非这个类本身是一个抽象类
4.一个类如果实现了某个接口A,而这个接口又去继承了某个接口C
那么这个类必须要全部实现接口A中的所有方法,包括接口A从
他的父接口当中继承过来的方法!!!
5.接口可以yy成继承!!!
-----------------------------------------------------------------------------------
面向接口编程:
1.对象的编译时类型写成接口
2.方法的参数类型写成接口
3.方法的返回类型写成接口
-----------------------------------------------------------------------------------
接口的分类:
1.业务接口->定义一些用来处理业务的方法,比如CRUD
2.常量接口->用来管理整个应用程序当中的所有的常量属性
只定义了常量
3.标记接口->什么都没有
java.io
接口 Serializable 标记接口,JVM针对此类型作判断
判断某个对象是否具备持久化操作!!!
通过instanceof运算符来判断某个类是否属于某个类型
练习:
1.定义一个抽象父类Vehicle
实现Moveable接口
void getDirection(int dir);
2.定义俩个子类分别是Car Plane
3.写工厂类VehicleFactory
----------------------------------------------------------------------------------------------
先知道最终我们的打印需求...
1.分析接口Moveable->业务接口->方法->void run(int dir);
->int getSpeed();
2.分析常量接口IContants->知道每个常量属性用在何处?
3.分析标记接口ICheckSpeed
4.定义父类Vehicle->父类当中的共有的方法
String getDirection(int type);
5.分析子类Car Plane->子类是否调用了父类当中的方法!以及子类中实现接口中的方法
6.分析简单工厂类MoveableFactory->掌握以下面向接口编程
7.制定业务类MoveableBiz
8.测试类TestMoveableBiz
--------------------------------------------------------------------------------------------------
抽象类和接口之间的选择
名词性用抽象类
动词性用接口
抽象类和接口之间的区别和共同点
共同点:
1.都是属于抽象数据类型
2.都不能够被实例化
不同点:
1.抽象类当中可以有构造方法,但是接口当中不能有构造方法
2.抽象类当中可以有普通属性以及普通方法,接口当中的属性都是
公开的静态的常量属性,接口当中的方法都是公开的抽象的方法
3.抽象类仅仅支持单继承,但是接口是支持多继承的
4.一个类只能继承一个抽象父类,但是一个类可以实现多个接口
5.类与类之间是extends,接口与接口之间也是extends
类与接口之间是实现implements
----------------------------------------------------------------------------------------------------
回调函数(callback)
俩个人在通电话
A->B->现在没空,等会回你
->A说我给你留个号码,等会你拨打这个号码!!!
此处的号码就相当于一个回调函数!!!
服务端S有个方法s,客户端C有个方法c
客户端的对象去调用服务端中的某个方法的时候,服务端S突然
接受到某个时间的指令,在某个时刻又去调用客户端中的某个方法c
c就是回调函数!!!
回调+模版
----------------------------------------------------------------------------------------------------------
软件设计原则:
1.高内聚
模块内部或者对象内部能够独立完成业务的能力比较强
内聚越强,设计越好
2.低耦合
模块与模块之间或者对象与对象之间的依赖程度
设计越好,耦合越低。。。
------------------------------------------------------------------------------------------------------------