接口可以包含域,但是这些域隐式地是static和final的。
interface CanFight{
void fight();
}
interface CanSwim{
void swim();
}
interface CanFly{
void fly();
}
class ActionCharacter{
public void fight(){};
}
class Hero extends ActionCharacter implements CanFight,CanSwim,CanFly{
@Override
public void fly() {}
@Override
public void swim() {}
}
public class TestInterface {
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);
w(h);
}
}
注意CanFight接口与ActionCharacter类中的fight()方法的特征签名是一样的,而且在Hero中并没有提供fight()的定义,因为fight()方法可以来自ActionCharacter。然而这里有个问题就是覆盖、实现和重载可能会搅在一起,造成代码可读性混乱,如下
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{
@Override
public int f(int i) {
return 0;
}
@Override
public void f() {
}
}
class C3 extends C implements I2{
@Override
public int f(int i) {
// TODO Auto-generated method stub
return 0;
}
}
class C4 extends C implements I3{
public int f(int i){
return 1;
}
}
//class C5 extends C implements I1{}//The return types are incompatible for the inherited methods I1.f(), C.f()
//interface I4 extends I1,I3{}//The return types are incompatible for the inherited methods I1.f(), I3.f()
注意注释的部分。
关于嵌套接口,嵌套的接口要是被定义为private只能被起自身所使用,就是在自身内有public把那个嵌套接口暴露给外面使用,那个被暴露的接口不允许向上转型。
如果知道某事物应该成为一个基类,那么第一选择应该是使它成为一个接口。