转自--https://blog.csdn.net/Jae_Peng/article/details/80151033

不习惯用csdn,博客园没有搜到类似的,摘录过来。

多态:要有继承,方法的重写,父类引用指向子类对象

疑问一:父类引用指向子类对象 与指向父类对象

Animal cat = new Cat(); //向上转型。

父类引用指向子类对象,该引用不能再访问子类新增加的成员,那么这样和直接new一个父类实例(Animal a = new Animal())有什么区别?

1、当父类是抽象类或是接口时,不能实例化时,只能运用多态,向上转型。

2、普通类中,可以在子类中重写父类中的方法,这样就可以访问子类中的重写方法。或者:Cat c = (Cat)cat; 向下转型,再访问子类中新增加的成员。

Eg: List是接口,ArrayList是List的实现类。

疑问二:父类引用指向子类对象 与子类引用指向子类对象

至于为什么是写成List list = new ArrayList()而不是ArrayList arrayList = new ArrayList()有如下的原因:

1.接口的好处

1 接口有什么好处,这种定义方式就有什么好处

当然你可以用 ArrayList list = new ArrayList()

但是一般不这么用

2.改动小

2 设计模式中有对依赖倒置原则。程序要尽量依赖于抽象,不依赖于具体。

从Java语法上,这种方式是使用接口引用指向具体实现。

比如,你若希望用LinkedList的实现来替代ArrayList的话,只需改动一行即可:

List list = new LinkedList();

1

而程序中的其它部分不需要改动,这样比较灵活

这个如果你想把存储结构改为LinkedList的时候,只要把List list = new ArrayList()改为list = new LinkedList()而其他的所有的都不需要改动。这也是一种很好的设计模式.一个接口有多种实现,当你想换一种实现方式时,你需要做的改动很小.

假设你开始用 ArrayList alist = new ArrayList(), 这下你有的改了,特别是如果你使用了 ArrayList 特有的方法和属性。 ,如果没有特别需求的话,最好使用List list = new LinkedList(); ,便于程序代码的重构. 这就是面向接口编程的好处

3.面向接口编程

4.提高程序宽展性,以后修改维护好些

详细解释:

ArrayList不是继承List接口,是实现了List接口。

你写成ArrayList arrayList = new ArrayList();这样不会有任何问题。和List list = new ArrayList();相比这2个写是有区别的。arrayList是一个ArrayList对象,它可以使用ArrayList的所有方法。

List是接口,它是不可以被实例化的(接口是个抽象类),所以必须以它的实现类去实例化它。list对象虽然也是被实例化为ArrayList但是它实际是List对象,list只能使用ArrayList中已经实现了的List接口中的方法,ArrayList中那些自己的、没有在List接口定义的方法是不可以被访问到的。

我们说,用接口去做是有它的好处的,如果你把类型定义成ArrayList(也就是一个具体的实现类)那么你就只能接收这一种类型的数据了,如果你要是定义为List那么你不仅可以接收ArrayList的对象还可以接收LinkedList的对象,这样你的程序就灵活了。

————————————————

版权声明:本文为CSDN博主「Jae_Peng」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/Jae_Peng/article/details/80151033

最新文章

  1. 理解Session与Cookie
  2. python对XML的解析
  3. Darlington Pair
  4. xcode 8   去除无用打印信息
  5. 各大门户网站的css初始化代码
  6. hdu 1014.Uniform Generator 解题报告
  7. vector在C++中的基本用法
  8. synchronized关键字,Lock接口以及可重入锁ReentrantLock
  9. 关于ExpandableListView用法的一个简单小例子
  10. 【阿里云产品公测】OpenSearch初探
  11. OpenCV 2.4.3在VS2010上的应用
  12. Sort List ——LeetCode
  13. 深入JS系列学习2
  14. mac brew 安装包下载失败解决
  15. Make Hadoop 1.2.1 run, my first try
  16. day4 liaoxuefeng---函数
  17. 搭建第一个spring boot项目
  18. string类的几种方法
  19. 从svn迁移至Git并保留所有 commit 记录
  20. php把一些预定义的 HTML 实体转换为字符。

热门文章

  1. Software_programming_automation_selenium
  2. 雪花算法生成id长度过长处理
  3. 蓝牙mesh组网实践(手机配网例程改低功耗)
  4. zzul1058_Java
  5. supervisor+gunicorn+uvicorn部署fastapi项目
  6. vue3 门户网站搭建6-wangeditor
  7. vue3 门户网站搭建4-mockjs
  8. 》》》Java利用aspose-words将word文档转换成pdf(破解 无水印)
  9. 剑指 Offer 栈与队列
  10. 尚硅谷大数据技术之Kettle软件介绍与使用方法