debug1379

导航

 

心血来潮琢磨了这么一个问题:
List list = new ArrayList<>();
这句代码挺常用的,但是如果要从面向对象的角度去讲讲这句代码背后的逻辑,该怎么讲?
好像真不容易一口气说完整,于是便有了本文的梳理。

从关系图我们可以知道,ArrayList继承自一个抽象类AbstractCollection,它们都实现了List接口。

查阅源码可知,AbstractCollection实现了接口List中的部分方法(比如add(E e)),但有些方法并没有实现(比如get(int index)仍然是抽象方法)。
而ArrayList作为非抽象类,必然要实现List中的所有抽象方法。ArrayList中所有来自List的方法,既可以理解为接口的实现,也可以理解为对父类方法的重写。

现在,让我们回头再看看开头那句代码:
右边是一个ArrayList对象,左边是一个List接口,是不是很像“父类引用指向子类对象”?
将一个实现类ArrayList向上转型(upcasting)成list接口。通过list调用方法时,实际调用的是ArrayList中的方法,这就实现了多态。

posted on 2024-02-27 22:16  debug1379  阅读(8)  评论(0编辑  收藏  举报