如何理解:List<String> list=new ArrayList<String>();为甚麼要声明为List 而不是ArrayList<String>?

在java中 使用面向接口编程 也就是面向抽象编程 这样程序 可扩展性更好 降低耦合 ArrayList LinkedList 都是List 的子类 就像 Set 也是Collection 的子接口 它的实现 有 hashSet linkedHashSet TreeSet 等

工作中很多时候,我们需要把很多种类的实例对象,全部扔到一个集合,这个时候我们应该寻找到一个标准,接口就是一个标准。或者可以理解:把很多种类的子类实例对象全部扔到存放父类实例的集合。

向上转型(声明使用父类):子类对象会遗失 与父类不同的方法 ,还有 丢失的子类特有方法

向下转型:可以调用子类那些特有的方法,重新获得丢失的子类特有方法<泛型是常用>

第一种形式用当前类作为引用类型,那么可以访问到ArrayList这个类中的所有公用方法。

第二种形式,用ArrayList实现的接口List作为引用类型,那么通过list引用可以访问到接口中定义的方法。

也就是说ArrayList这个类实现了List接口,除了要必须实现接口List中声明的方法外,还可以实现额外的一些方法。

但是,第二种形式就无法调用的List接口以外的方法。
使用上,设计模式中有:“代码尽量依赖于抽象,不依赖于具体”。第一种形式就是依赖具体,第二种形式就是依赖于抽象。因为List是接口。代码依赖于抽象的好处是,代码可以方便替换。

例如:代码List list = new ArrayList();下面通过list来操作集合。代码编写后发现集合使用的不准确,应该使用LinkedList,那么只要修改一行代码List list = new LinkedList();就可以,这行以后的代码不需要修改,因为List接口保证了调用的都是接口中的方法,而ArrayList与LinkedList都实现了List接口。而如果当时用ArrayList list = new ArrayList()这种形式的话,那么list访问到的就可能是ArrayList里独有的方法而非List接口中的方法。这样替换成LinkedList的时候就有可能需要修改很多的代码。

List<String> list=new ArrayList<String>(20);为什么要声明为List 而不是ArrayList<String>?的更多相关文章

  1. 在String()构造器不存在的情况下自定义一个MyString()函数,实现如下内建String()方法和属性:

    在String()构造器不存在的情况下自定义一个MyString()函数,实现如下内建String()方法和属性: var s = new MyString("hello"); s ...

  2. 声明:function FileSetAttr ( const FileName : string

    对文件和文件夹都有效  FileSetAttr('D:\Administrator\Desktop\patcher\Win32\Release\config\element\update',faHid ...

  3. Date类为什么设计为可变的,而不是像String一样?

    首先,不得不承认,这确实是类库设计的一个错误,所以"为什么"进行了这个错误设计并没有意义.但没有事物一诞生就是完美的,我们的Java只是反应的慢了一点,再慢了一点. 更何况,Dat ...

  4. 众所周知,static修饰的成员只实例化一次,而string类型每次赋值都会重新创建一个实例,那么用static修饰string呢?

    string 类型每次实例化都会重新创建一个实例: 解释:string 类型重载了运算符 “=” ,每次 “=” 操作都是一次 “new”. static 修饰符的成员只实例化一次?? 解释:这个说法 ...

  5. String s = "Hello";s = s + " world!";这两行代码执行后,原始的String对象中的内容到底变了没有?

    没有.因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象.在这段代码中,s原先指向一个String对象,内容是 "Hello",然后我们对s进行 ...

  6. Java List<String> list=new ArrayList<String>();为什么要声明为List,而不是ArrayList<String>

    例如:代码List list = new ArrayList(); 下面通过list来操作集合.假如代码编写后却发现集合使用的不准确,应该使用LinkedList,那么只要修改一行代码List lis ...

  7. Java基础(31):String的大小写转换、分离成数组、==与equals()的区别(String类)

    继续来看 String 类常用的方法,如下代码所示: 运行结果: 那么,“==” 和 equals() 有什么区别呢? ==: 判断两个字符串在内存中首地址是否相同,即判断是否是同一个字符串对象 eq ...

  8. String常用使用方法,1.创建string的常用3+1种方式,2.引用类型使用==比较地址值,3.String当中获取相关的常用方法,4.字符串的截取方法,5.String转换常用方法,6.切割字符串----java

    一个知识点使用一个代码块方便查看 1.创建string的常用3+1种方式 /* 创建string的常用3+1种方式 三种构造方法 public String():创建一个空字符串,不含有任何内容: p ...

  9. java@ 利用ArrayList实现dijkstra算法以及topological 排序算法(java.util.ArrayList)

    package dataStructure; import java.util.ArrayList; import java.util.LinkedList; import java.util.Que ...

随机推荐

  1. Android 新老两代 Camera API 大起底

    https://blog.csdn.net/Byeweiyang/article/details/80515192 0.背景简介 最近有一部分相机相关的需求,专注于对拍摄的照片.视频的噪点.色温.明暗 ...

  2. Web开发相关笔记 #04# WebSocket

    本文的主要内容: HTTP VS. WebSocket WebSocket 的客户端实现(JavaScript) WebSocket 的服务端实现(Java & apache WebSocke ...

  3. jsoi r2d1t3的50分

    #include<bits/stdc++.h> using namespace std; int n,r,x,y; double ans; double dis(int x,int y){ ...

  4. mysql5.5被django抛弃,安装mysql5.7记录

    安装: https://www.jb51.net/article/123004.htm 问题解决: https://blog.csdn.net/zztingfeng/article/details/8 ...

  5. Python学习基础(二)——集合 深浅拷贝 函数

    集合 # 集合 ''' 集合是无序不重复的 ''' # 创建列表 l = list((1, 1, 1)) l1 = [1, 1, 1] print(l) print(l1) print("* ...

  6. 自动发现实现url+响应时间监控

    url自动发现脚本: [root@jenkins scripts]# cat  urlDiscovery.py #!/usr/bin/env python #coding:utf-8 import o ...

  7. 你不知道的JavaScript(1)LHS查询和RHS查询

    打算把<你不知道的JavaScript>中的知识点整理下,写点自己的心得,同时也敦促自己看书. 先做个整体的介绍,最后会再给个综合的例子. RHS 查询与简单地查找某个变量的值别无二致,而 ...

  8. 51Nod 1667 概率好题 - 容斥原理

    题目传送门 无障碍通道 有障碍通道 题目大意 若$L_{i}\leqslant x_{i} \leqslant R_{i}$,求$\sum x_{i} = 0$以及$\sum x_{i} < 0 ...

  9. Chrome视频解析插件

    我们在观看一些平台的视频资源时,比如优酷视频.腾讯视频.爱奇艺等等,通常都会需要VIP资格才能观看到更稀缺的视频,如何通过破解来实现免VIP观看呢?下面我们来看一看怎么用Chrome插件实现. 视频解 ...

  10. 在VMware14上安装centos6.5

    打开vmware14  =>  创建新虚拟机(即再建一个linux),已有光盘映像文件,正常操作即可.