之前由文章介绍过抽象类与接口,今天在深入一点
1.抽象类
包含抽象方法的类称为抽象类,抽象类不可创建对象,如果某个抽象类的子类想要实例化对象,必须实现抽象父类中所有方法的定义。创建抽象类和抽象方法可以使类的抽象明确起来。
2.接口
结构允许创建者确定方法名,参数列表和返回类型,但是没有任何方法体,允许类继承多个接口,实现类似多冲继承的功能。接口也可以包含域,但是都是隐式的final和static的。接口也可以继承接口,一个类只能继承一个类,但是可以继承多个接口。
3.完全解耦
接口相对于类来说,会降低耦合性,增加代码的复用。
4.接口的向上转型
一个类可以继承多个接口,并且可以向上转型为每个接口,每一个接口都是一个独立的类型。下面看一个接口向上转型的实例
package test;
interface CanFly{
void fly();
}
interface CanFight{
void fight();
}
interface CanSwim{
void swim();
}
class Action{
public void fight(){
System.out.println("Action fight");
};
}
class Hero extends Action implements CanFight,CanSwim,CanFly{
@Override
public void swim(){
System.out.println("swim");
};
public void fly(){
System.out.println("fly");
};
}
public class Interface{
public static void t(CanFly x){x.fly();}
public static void u(CanSwim x){x.swim();}
public static void v(CanFight x){x.fight();}
public static void x(Action x){x.fight();}
public static void main(String[] args){
Hero h = new Hero();
t(h);
u(h);
v(h);
x(h);
}
}
运行结果
fly
swim
Action fight
Action fight
可以看到Hero组合了多个接口,在主类中使用四个方法,把上述接口作为参数传递,意味着可以被向上转型为每一个接口,是使用接口的核心原因,另一个原因是防止客户端程序员创建该类接口的对象,确保这只是一个接口。
5.接口中的域
接口中的域是static,final的,在之前版本常当用来放置常量,现在用枚举类来替代更加灵活方便。