在Java中,引用变量实际上是一个指针,它指向的是堆内存中的对象实例。
例:
List<?> list=new ArrayList<?>
Map<?,?> map=new HashMap<?,?>
其中List只是ArrayList实现的一个接口而不是它的父类,不是父类引用指向子类对象。
同样Map也只是HashMap实现的一个接口而不是它的父类,不是父类引用指向子类对象
为什么一般都使用List list=new ArrayList(),而不用ArrayList alist=new ArrayList()呢?
问题在于List有多个实现类(即实现了List接口的类),如LinkedList或者Vector等等。现在你用的是ArrayList,也许哪一天你需要换成其他的实现类呢?这时就只要list=new LinkList()就行了。
注意事项
list只能使用ArrayList中已经实现了的List接口中的方法,ArrayList中那些自己的、没有在LIst接口定义的方法是不可以被访问到的。接口变量只能调用接口本身提供的方法(在类中被重写的)。
即当把实现了某一接口的类创建的对象的引用赋给该接口声明的接口变量时,那么该接口变量就可以调用被类实现的接口中的方法。
实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称为对象功能的接口回调。