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里改变即可。