A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 jiangweibin2573 于 2014-8-11 09:03 编辑

在使用集合的时候,一般都提倡用接口类型指向其子类实例对象,也就是多态形式。
可以说说你感觉到的多态的好处!!


  1. List<String> al = new ArrayList<>();//泛型推算
复制代码

这样不就不能直接利用ArrayList中的特有方法了吗?
为什么不提倡一开始就使用ArrayList,我明知道我就是用这种结构,为啥绕道List。

9 个回复

正序浏览
jiangweibin2573 发表于 2014-8-11 15:42
我如果使用ArrayList中间特有方法呢,你怎么知道我指向了ArrayList

你说的这种情况用你的是对的。所以用哪种方式不是绝对的。就像以后用到集合的地方建议用ArrayList一样,只是说这种方式使用较常见。
回复 使用道具 举报
﹑淼 发表于 2014-8-11 15:21
不是一开始就有ArrayList的。ArrayList实现了List接口,用多态的形式可以使用更多的方法,而且这样程序也灵 ...

我如果使用ArrayList中间特有方法呢,你怎么知道我指向了ArrayList
回复 使用道具 举报
主要是为了使程序的扩展更灵活。在简单的、不考虑扩展的情况下可以不用考虑这些。
回复 使用道具 举报
﹑淼 中级黑马 2014-8-11 15:21:51
7#
不是一开始就有ArrayList的。ArrayList实现了List接口,用多态的形式可以使用更多的方法,而且这样程序也灵活,后期维护起来就方便。比如要用LinkedList替换ArrayList,只改一行就行了。
回复 使用道具 举报
es2379649 发表于 2014-8-11 10:35
如果有这样的情况,假如这个程序后来,我觉得ArrayList不好而且没有用了。我想要一个LinkedList,就可以不 ...

说是这么说的!但是这样父类指向了子类,使用子类时候不是麻烦了
回复 使用道具 举报
如果只在一个程序的一个地方用一次,用什么声明都行,也不会有人说应该用 List 吧。
只有你的类要拿给别人用的时候声明成员变量,你的方法声明接收变量的时候,这样的要求(做法)才有意义。简单的例子:
  1.         public static void print(Object obj) {
  2.                 System.out.println(obj);
  3.         }
  4.         public static void print(String str) {
  5.                 System.out.println(str);
  6.         }
复制代码

第一种可以 print(1); 而第二种只能 print(""+1); 对于这样的情况,在保证方法运行的前提下,接收变量范围越大越好。
所以任何一行可以写完的声明都不用考虑这个,感觉怎么好看怎么写就行。
反对任何不重新声明变量就改变指向的做法,哪有一个名字适用于一个方法里面两个地方的
回复 使用道具 举报
面向对象和面向接口不矛盾。
面向接口是指当我们使用一个功能时,我们应该尽可能放弃不必要的假设和要求,比如“用一个容器来存储一串数字”,那么我们不应该提示额外要求“我们应该用一个 List 还是 Set” 而是尽量只提出要求 “我们需要一个容器”,这样一来,我们就用下面这样的方法,注意的是,c 的创建和使用可以是在不同的地方然后当成参数或成员变量传递给使用者,对于使用者来说“这是一个你想要的容器”,至于它具体是哪种容器使用者不应该关心它,如果使用者强制需要一个 Set 那么应该修改需求说明成为“我们需要一个保证唯一性的集合”;为什么我们尽量不提出非必要的要求呢?当软件越来越复杂或者或者达到松耦合的要求时我们应该尽量避免把一个东西弄成一个固定的样子,这防碍将来对它进行修改或扩充,“尽量只提出功能性的要求而不是限制别人必要把代码写成什么样子”,“功能性的要求”其实就是就是对应到面向对象的“接口”,一般来说当我们依赖其它人写的代码时我们应该把它看成一个组件,它的内部实现方法我们并不关心,只要求实现功能的人和使用功能的人使用了相同的接口就可以了,这就可以让实现功能的人发挥它的想象力在组件的性能和稳健性和灵活性及扩展性上有机会做到更好 ,如果你已经知道了并且依赖这个实现的细节那么这个组件的每次修改都可能导致使用它的代码产生新的问题,那么这就是一个严重的问题,软件的质量就不能保证,我们应该支持积木式的组件供应方法,只需要修改一个配置就成把一个组件替换成另一个,这就是  Spring 的配置文件给我们最直观的印象,这时使用这个组件的代码不会受到影响,比如同样一个加密的组件,使用不同的算法的安全程度和性能不同,但都能达到通信双方的安全要求,这样一来使用者的代码不需要知道细节也不用修改就能通过修改 Spring XML 达到替换加密组件的要求:
回复 使用道具 举报
如果有这样的情况,假如这个程序后来,我觉得ArrayList不好而且没有用了。我想要一个LinkedList,就可以不重新声明变量名直接把al的引用改成LinkedList就好了。这样很方便啊,而且没有指向的原ArrayList对象会被垃圾回收器回收,节省内存。
回复 使用道具 举报
讨论,讨论!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马