请求各位大大解释一下JAVA接口的作用,该如何解决

请求各位大大解释一下JAVA接口的作用
A a = new AImpl(); (1)
AImpl a = new AImpl(); (2) 
a.say();

A是接口
用(1)或(2)都可以得到对象a并调用say()方法

为什么需要用(1)呢··那不多余定义了一个接口A吗?·
谢谢各位··

------解决方案--------------------
面向接口/抽象编程
有利于扩展/维护
参考各种设计模式,例如工厂,责任链,装饰
------解决方案--------------------
这是思想问题,工作肯定是多做了

+1
探讨

面向接口/抽象编程
有利于扩展/维护
参考各种设计模式,例如工厂,责任链,装饰

------解决方案--------------------
不错,楼上说是思想的问题。
如果A的实现类只有AImpl一个,那显然显得是多余了
假设你是雇主、招很多人,你只需要告诉他们干什么、要什么结果就可以了,不需要知道他们是如果干的。
程序也是一样、不需要知道实现、只需要知道接口中的方法就好了。


还有就像电脑的usb接口一样,同样的接口可以插鼠标、键盘、硬盘、摄像头
就好比“鼠标、键盘、硬盘、摄像头”都是这个A接口的实现类
------解决方案--------------------
如果是多个类都实现了A接口 ,而使用的时候,又不能很好的区分出具体是那个类 ,这时候使用接口就可以了,比如:

public interface A{
public void say() ;
}
public class A1Impl implements A{
public void say(){
}
}

public class A2Impl implements A{
public void say(){
}
}

public class A3Impl implements A{
public void say(){
}
}


import java.util.List ;
import java.util.ArrayList ;
public class Test {

public static void main(String[] args){
List list = new ArrayList() ;

list.add(new A1Impl()) ;
list.add(new A3Impl()) ;
list.add(new A2Impl()) ;
list.add(new A3Impl()) ;
 
A a ;
for (int i = 0; i < list.size(); i++){
a = (A)list.get(i) ; //不管是哪个实现类 ,统一转换为接口A
a.say() ; 
}
}
}