接口的灵活性就在于“规定一个类必须做什么,而不管你如何做”。我们可以定义一个接口类型的引用变量来引用实现接口的类的实例,当这个引用调用方法时,它会根据实际引用的类的实例来判断具体调用哪个方法,这和上述的超类对象引用访问子类对象的机制相似。
1 //定义接口InterA 2 interface InterA 3 { 4 void fun(); 5 } 6 //实现接口InterA的类B 7 class B implements InterA 8 { 9 public void fun()10 {11 System.out.println(“This is B”);12 }13 }14 15 //实现接口InterA的类C16 class C implements InterA17 {18 public void fun()19 {20 System.out.println(“This is C”);21 }22 }23 24 class Test25 {26 public static void main(String[] args)27 {28 InterA a;29 a= new B();30 a.fun();31 a = new C();32 a.fun();33 }34 }
输出结果为:
This is BThis is C 上例中类B和类C是实现接口InterA的两个类,分别实现了接口的方法fun(),通过将类B和类C的实例赋给接口引用a而实现了方法在运行时的动态绑定,充分利用了“一个接口,多个方法”展示了的动态多态性。 需要注意的一点是:Java在利用接口变量调用其实现类的对象的方法时,该方法必须已经在接口中被声明,而且在接口的实现类中该实现方法的类型和参数必须与接口中所定义的精确匹配。 结束语 以上就是java运行时多态性的实现方法,大家在编程过程中可以灵活运用,但是在性能要求较高的代码中不提倡运用运行时多态,毕竟Java的运行时动态方法调用较之普通的方法调用的系统开销是比较大的。