之前我们知道,采用interface为我们提供了一种将抽象与实现分离的结构化的方法,但是interface的作用远不止此,在Java中接口解决了一个非常重要的问题:多继承。在C++中,实现多重继承是比较简单的事儿,但是Java继承机制不允许多重继承,所以如果想要整合不同类的功能,就需要使用接口,我们来看个例子:
[java] view plain copy
interface CanFight {void fight();}
interface CanFly {void fly();}
interface CanSwim {void swim();}
class ActionCharacter {public void fight(){}}
class Hero extends ActionCharacter implements CanFight, CanFly, CanSwim {
@Override
public void swim() {}
@Override
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(ActionCharacter x){x.fight();}
public static void main(String[] args) {
Hero h = new Hero();
t(h);
u(h);
v(h);
w(h);
}
}
我们可以看到:
1、Hero类中拥有了所有类的功能。
2、Hero可以和它实现的这些接口进行相互转换,当我们将hero对象做参数,传入Adventure类的各个方法时,Hero类向上转型了。(此处我们得出了一句话:在Java中,接口可以和实现了该接口的类相互转换)。讲到此处,我想总结下使用接口的好处:
1、接口可以实现向上转型,多个具有共同属性的类可以将它们的共同点提取出来,做成抽象,这样层次分明,统一管理。
2、接口不具有任何实现,最适合做基类。
总结一下抽象类与接口的区别和联系:
a) 抽象类是类,可以有实体方法。
b) 抽象类不能实现多继承,而接口可以。
c) 如果需要创建不带任何方法定义和成员变量的基类,则使用接口,如果类中需要有部分具体的实现,则使用抽象类。
d) 如果事先想要将某类设计为一个基类,那么首选接口。(注意c和d是接口的使用场景)
接口可以通过继承(extends)接口,来拓展功能。接口中的域默认是final、static的,我们可以通过类名来直接引用。 |
|