开发者社区> 问答> 正文

Java集合框架中的多态问题

如何理解这三种定义方式
·
Collection arr1 = new ArrayList();
List arr2 = new ArrayList();
ArrayList arr3 = new ArrayList();·

展开
收起
蛮大人123 2016-03-10 14:32:30 1931 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    其实不是三种情况,是两种情况。
    我给你举个实际开发中经常碰到的场景的例子,你就明白为什么“我们经常要把一个对象转型成它的父类或接口来使用了”。

    通常我们在使用列表的时候都是这样写的:
    List list = new ArrayList();
    而不是
    ArrayList list = new ArrayList();
    第一种为什么比第二种好?
    假设你用了二种方式声明一个列表,然后被其他人引用了(或者被你自己在其他地方用了)。
    突然有一天,你发现用ArrayList不好,需要换成LinkedList,那么你肯定要把声明改成:
    LinkedList list = new LinkedList();
    这样以来,用到你的list的地方都得更改类型声明。更重要的是,用到你的list的人,他们写自己的代码的时候是基于“你的这个list是一个ArrayList ”这样的前提来写的,你突然把它改成了LinkedList,很可能导致他们的程序出错或者需要重写。
    但是如果你一开始就用第一种声明方式,就不会有这个问题。你随时可以更换list的,引用你的list的其他人或其他地方不需要任何修改。例如:
    List list = new LinkedList();
    所以说,当你声明一个变量的时候,把它的类型声明得越笼统越好,越具体越糟糕。前者对修改是友好的,后者对修改不友好。
    类似的,确定一个方法的可访问性(即public、protected、默认的、private)时,在可能的情况下,越小越好。

    2019-07-17 18:57:38
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载