1、抽象类和抽象方法
2、接口
接口中的方法必须是public(可省略不写),实现类中实现方法也必须是public的。
3、完全解耦
只要一个方法操作的是类而非接口,那么你就只能使用这个类及其子类。如果这个方法还想操作其他类型,就会发生错误。而接口就可大大放宽这种限制,使得我们可以编写复用性高的代码。例如:有一个手机类,接口是播放器play(),有不同的导出类继承这个手机类,一个方法接收手机对象,调用play方法播放音乐。但是这个方法只能接收手机对象和导出类对象。如果我想让电脑播放音乐,由于电脑不属于手机继承体系,所以不能实现这种功能。但是如果我们把播放功能抽象到一个接口里,让手机实现这个接口,电脑实现这个接口,那么这个方法只要接收接口参数即可。实现了解耦合。
如果手机类是我们创建的,我们可以直接添加implements,但是如果它是jar里的或者别人的,我们不能直接修改它怎么办呢?
可以使用适配器模式,创建一个适配器类,实现接口,组合所需要的对象,在方法里调用该对象相应的方法。
4Java中的多重继承
一定要记住:使用接口的核心原因就是为了能向上转型成多个基类(以及由此带来的灵活性),第二个原因就是与使用抽象类相同:防止客户端创建该类的对象。
5通过继承扩展接口
利用extends关键字可以扩展接口里的方法
注意 组合接口时的名字冲突
interface I1{void f();} interface I2{int f(int i);} interface I3{int f();} class C{public int f(){return 1;}} class C2 implements I1,I2{ public int f(int i) { return 0; } public void f() { } } class C3 extends C implements I2{ public int f(int i) { return 0; } } class C4 extends C implements I3{ //Identical, no problem; public int f(){ return 1; } } //methods differ only by return type; //! class C5 extneds implements I1{} //! interface I4 extends I1,I3{}
6、适配接口
7、接口中的域
接口中的域都自动是static和final的,所以接口杰成为了一种很便捷的用来创建常量组的工具。在接口中定义的域不能是“空final”,但是可以被非常量表达式初始化。
8、嵌套接口
嵌套在另一个接口中的接口自动是public的,而不能声明为private的。当实现某个接口是,并不需要实现嵌套在其内部的任何借口,而且,private接口不能在定义它的类之外被实现。
9、接口与工厂
接口是实现多继承的途径,而生成遵循接口对象的典型方式就是工厂方法设计模式。
原始方式:
方法以接口为参数,void action(Service s){...}
调用的时候if(xxx)action(new SImp1());else if(xxx)action(new SImp2());else if....每个调用地方都需要直接提供实现类对象。如果需要修改/增加实现类代码就会很冗余。
工厂方式:
void action(ServiceFactory fac){Service s = fac.getService();....}
只需要在factory里改变即可。