接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法。
在说接口之前,先看下抽象类和抽象方法。抽象类,指包含抽象方法和普通方法的类。用abstract作为前缀。
抽象类,只能交给子类去实现,不能直接构造。
接口是抽象类中一种特殊的表现方式:因为abstract关键字允许人们在勒种创建一个或多个没有任何定义的方法--(接口)部分。但是没有提供任何相应的具体实现。实现有子类的继承者创建。interface 这个关键字产生一个完全抽象的类,它允许创建者确定方法名,参数列表和返回类型,没有方法体。
接口也可以包含域:但是为static和final ,(java8 之后可以有实现方法default)
9.3 完全解耦
class Processor {
public String name() {
return getClass().getSimpleName();
}
Object process(Object input) { return input; }
}
class Upcase extends Processor {
String process(Object input) { // Covariant return
return ((String)input).toUpperCase();
}
}
class Downcase extends Processor {
String process(Object input) {
return ((String)input).toLowerCase();
}
}
class Splitter extends Processor {
String process(Object input) {
// The split() argument divides a String into pieces:
return Arrays.toString(((String)input).split(" "));
}
}
public class Apply {
public static void process(Processor p, Object s) {//用父类作为参数传递
System.out.println("Using Processor " + p.name());
System.out.println(p.process(s));
}
public static String s =
"Disagreement with beliefs is by definition incorrect";
public static void main(String[] args) {
process(new Upcase(), s);
process(new Downcase(), s);
process(new Splitter(), s);
}
}
Apply.process 方法里可以接受任何类型的对象,并将它起应用到一个object对象中,然后打印本结果,想本例这样,创建一个能根据所传递的参数对象的不同而具有不同行为的方法,被称作为策略模式。 这类方法包含所有执行的算法中固定不变的部分,而侧罗包含变化的部分,策略就是传递进去的参数对象,它包含将要执行的代码,processor就是一个策略,
解析:Hero组合了具体类ActionCharartor和三个接口,组成规则必须先继承,后实现,
9.4 java中的多重继承
java继承的接口都跟随在implements后,采用逗号一一隔开,可以继承任意多个几口,并且可以向上转型为每个接口,因为每一个接口都是独立类型,
当继承类为抽象类或者普通类,并实现接口的时候,父类必须放在前面,后面跟着的是接口
interface CanFight{
void fight();
}
interface CanSwim{
void swim();
}
interface CanFly{
void fly();
}
class ActionCaracter{
public void fight(){
}
}class Hero extends ActionCaracter implements CanFight,CanSwim,CanFly{
public void swim() {
}
public void fly() {
}
}
public class Adventure {
public static void t(CanFight x){x.fight();}
public static void u(CanSwim x){x.swim();}
public static void v(CanFly x){x.fly();}
public static void w(ActionCaracter x){x.fight();}
public static void main(String[] args) {
Hero h=new Hero();
t(h);
u(h);
v(h);
w(h);
}
}
1)canfight接口与actioncharacter类中fight方法一样,在创建hero的时候,没有实现fight的定义,那是因为在父类已经有实现
2)在adventure类中,可以看到这个四个方法,可以把接口和pojo都作为参数传递,当hero对象被创建的时候,可以向上转为任何一个
3)使用接口的原因是,防止客户端程序员创建该类的对象,并确保这仅仅是建立一个接口。
9.5通过继承来扩展接口
通过继承,可以容易获得接口添加的新的方法什么,还可以通过继承在新接口中组合数个接口,继承写法跟随在extends后面,采用逗号一一分隔开。
当在多重继承的时候,硬注意,方法签名和返回值相同的方法,应尽量双方达到一致。避免签名不一样,造成重载等问题
接口:允许同一个接口具有多个不同的具体实现,体现形式通常是一个接受接口类型的方法,而该接口的实现和想该方法传递的对象则取决于方法的使用者。接口的一种常见的用法就是前面提到策略模式。
9.7接口中域。
放入接口的域都自动为static和final,可以当枚举使用。
1)接口的定义的域不能是空final,但是可以被非常量表达式初始化。static,在类第一次被加载时候初始化。值存储在该接口的静态存储区域内。
9.8 嵌套接口
嵌套接口不是很常用,主要做来获取对接口的一个私有化,只有特定的对象才能获取
9.9接口与工厂
接口是实现多重继承的途径之一,而生成遵循某个对象的典型方式就是 工厂方式设计模式,这个与直接调用构造器不同,我们在工厂对象上调用的事创建的方法,而该对象将生成接口某个实现的对象。