接口的灵活性就在于“规定一个类必须做什么,而不管你如何做”。我们可以定义一个接口类型的引用变量来引用实现接口的类的实例,当这个引用调用方法时,它会根据实际引用的类的实例来判断具体调用哪个方法,这和上述的超类对象引用访问子类对象的机制相似。
//定义接口InterfaceA
interface <span style="font-family: Arial;">InterfaceA</span>
{
void fun();
}
//实现接口<span style="font-family: Arial;">InterfaceA</span>的类B
class B implements InterfaceA
{
public void fun()
{
System.out.println("This is B Method");
}
}
//实现接口<span style="font-family: Arial;">InterfaceA </span>的类C
class C implements InterfaceA
{
public void fun()
{
System.out.println("This is C <span style="font-family: Arial;">Method</span>");
}
}
class Test
{
public static void main(String[] args)
{
InterA a;
a= new B(); //<span style="color:#ff0000;">B为InterfaceA的实现类,只是合法的,可以通过instanceof运算符的;实际操作还是子类的对象</span>
a.fun();
a = new C();//C为InterfaceA的实现类
a.fun();
}
}
输出结果为:
This is B Method
This is C Method
需要注意的一点是:Java在利用接口变量调用其实现类的对象的方法时,该方法必须已经在接口中被声明,而且在接口的实现类中该实现方法的类型和参数必须与接口中所定义的精确匹配。