经常看到一个现象,接口的引用指向它实现类的一个对象
例如:List list = new ArrayList<String>();
为什么要这样用,而不使用:ArrayList list = new ArrayList<String>(); 这样做的好处是什么
这其实是Java中多态的一种表现
接口的实现类可以有很多个,如 LinkedList或者Vector等等,如果使用这种方式,List list = new ArrayList<String>(); 以后不想用ArrayList了,直接改为你想用的实现类,如List list = new LinkedList<String>(); 这样,虽然修改了实现类,但相关list调用方法的代码是不用修改的;如果是ArrayList list = new ArrayList<String>();这种写法,那就有可能要修改非常多代码了,因为,原本list调用了ArrayList中的方法来实现某个功能,再修改实现类过后,list原本调用的方法在LinkedList中不存在,则还要修改对应调用的方法;因此:
两种方式其实都能实现同一种效果,只是接口的引用指向实现类对象这一方法,是用接口来规范了实现的方法,这样子写的化就很清楚的知道哪些方法有,哪些方法没有。
这就是一种设计规范,如果按照这种设计规范来写,就可以免去在修改实现的对象吼调用方法不存在的情况。
这样写的好处是便于程序代码的重构. 这就是面向接口编程的好处
例如:
public class text {
public static void main(String[] arhs) {
Test a = new A();
Test t = new AB(a);
t.small();
}
}
interface Test{
void small();
}
class A implements Test{
@Override
public void small() {
System.out.println("我是A");
}
}
class B implements Test{
@Override
public void small() {
// TODO Auto-generated method stub
System.out.println("我是B");
}
}
class AB implements Test{
private Test test;
AB(Test test){
this.test = test;
}
//
@Override
public void small() {
// TODO Auto-generated method stub
test.small();
}
}
【注意】
list只能使用ArrayList中已经实现了的List接口中的方法,ArrayList中那些自己的、没有在List接口定义的方法是不可以被访问到的
list.add()其实是List接口的方法
但是调用ArrayList的方法如 clone()方法是调用不到的
总结:java在利用接口变量调用其实现类的对象的方法时,该方法必须已经在接口中被声明,而且在接口的实现类中该实现方法的类型和参数必须与接口中所定义的精确匹配。
接口的灵活性就在于“规定一个类必须做什么,而不管你如何做”。
我们可以定义一个接口类型的引用变量来引用实现接口的类的实例,当这个引用调用方法时,它会根据实际引用的类的实例来判断具体调用哪个方法