接口多态
接口的灵活性就在于“规定一个类必须做什么,而不管你如何做”。我们可以定义一个接口类型的引用变量来引用实现接口的类的实例,当这个引用调用方法时,它会根据实际引用的类的实例来判断具体调用哪个方法,这和上述的超类对象引用访问子类对象的机制
相似。
例
interface InterA{
void fun();
}
class B implements InterA{
public void fun(){
System. out. println(“This is B”);
}
}
class C implements InterA{
public void fun(){
System. out.println(“This is C”);
}
}
class Test{
public static void main(String[] args){
InterA a;
a= new B();
a.fun();
a = new C( );
a.fun();
}
}
输出结果为:
This is B This is C
上例中类B和类C是实现接口InterA的两个类,分别实现了接口的方法fun(),通过将类B和类C的实例赋给接口引用a,实现了方法在运行时的动态绑定,充分利用了“一个接口,多个方法”,展示了 Java 的动态多态性。
注意:Java 在利用接口变量调用其实现类的对象的方法时,该方法必须已经在接 口中被声明,而且在接口的实现类中该实现方法的类型和参数必须与接口中所定义的精确匹配。
接口多继承
在Java 中,类的多继承是不合法的,但接口允许多继承。
例:
package oop2;
public interface Attack{
public abstract void attack();
}
package oop2;
public interface medie{
public abstract void medictest();
}
package oop2;
public class shoottingman implements Attack{
public void attack(){
System.out.println("步兵可以攻击");
}
}
package oop2;
public class medicman implements Attack,medic{
public void medictest(){
System. out.println("医务兵可以治疗他人");
}
public void attack(){
System. out.println("医务兵也可以射击");
}
}
package oop2;
public class demotest {
public static void main(String[ ] args){
shoottingman test = new shoottingman( ) ;
test. attack( );
medieman test2=new medieman( );
test2. medictest();
test2. attack();
}
}
运行结果:
步兵可以攻击
医务兵可以治疗他人医务兵也可以射击
从代码的结构得出,步兵只是继承了射击的接口,因此只能有射击的方法;医务兵同时继承了射击和医疗的接口,因此可以同时有射击和医疗的方法。