List list = new ArrayList()为何父类引用指向子类对象(多态)
转自--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
List list = new ArrayList()为何父类引用指向子类对象(多态)的更多相关文章
- java多态性,父类引用指向子类对象
父类引用指向子类对象指的是: 例如父类Animal,子类Cat,Dog.其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类. Animal animal = new C ...
- C#多态;父类引用指向子类对象;new和override的区别;new、abstract、virtual、override,sealed关键字区别和使用代码示例;c#类的初始化顺序
关于父类引用指向子类对象 例如: 有以下2个类 public class Father { public int age = 70; public static string name = " ...
- java-多态中成员访问特点-父类引用指向子类对象
多态前提: - 要有继承关系. - 要有方法重写. - 要有父类引用指向子类对象. 1.成员变量:编译看左边(父类),运行看左边(父类) 2.成员方法:编译看左边(父类),运行看右边(子类),动态绑定 ...
- java 父类引用指向子类对象---动态绑定
知识点: 1.java 中父类引用指向子类对象时动态绑定针对的只是子类重写的成员方法: 2.父类引用指向子类对象时,子类如果重写了父类的可重写方法(非private.非 final 方法),那么这个对 ...
- Java多态-如何理解父类引用指向子类对象
java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是“向上转型”. 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过 Cat c = new ...
- Java多态 父类引用指向子类对象
Java多态的三个必要条件: 1. 继承 2. 子类重写父类方法 3. 父类引用指向子类对象 然后看一个例子 输出结果为: 给出结论:Father c = new Child() 在c的 ...
- 向上转型---父类引用指向子类对象 A a = New B()的使用
一.向上转型 向上转型是JAVA中的一种调用方式,是多态的一种表现.向上转型并非是将B自动向上转型为A的对象,相反它是从另一种角度去理解向上两字的:它是对A的对象的方法的扩充,即A的对象可访问B从A中 ...
- 28 面向对象编程 instanceof 代码 小结 父类引用指向子类对象
instanceof 代码 // main // Object > Person >Student Object object = new Student(); // 提取公式:XY之间是 ...
- JAVA基础复习与总结<一>(2) 父类引用指向子类对象(向上转型、动态链接)
先来看看下列代码 public class Animal { public static void main(String[] args){ Animal animal = new Cat(); // ...
- C++析构函数的自动调用(用于父类指针指向子类对象,内存泄漏问题)
class A {public:A() { printf("A \n"); }~A() { printf(" ~A \n"); } // 这里不管写不写virt ...
随机推荐
- aop切面记日志
package com.netauth.utils.component; import java.lang.annotation.ElementType; import java.lang.annot ...
- Mysql数据库基础第七章:流程控制结构
Mysql数据库基础系列 软件下载地址 提取码:7v7u 数据下载地址 提取码:e6p9 mysql数据库基础第一章:(一)数据库基本概念 mysql数据库基础第一章:(二)mysql环境搭建 mys ...
- jreg视频内容整理
目录 5种变得开心的方法 我(曾经)想死 别再问我过得好不好了 5种变得开心的方法 浪费时间,比如打游戏,什么都不干 停止思考,什么都不要想,刷视频 独处,不要跟别人分享你的痛苦,把自己的痛苦当作世界 ...
- speedtest测速
wget https://raw.github.com/sivel/speedtest-cli/master/speedtest.py chmod a+rx speedtest.py mv speed ...
- Web入门实战
Web入门实战 - [湖湘杯 2021 final]Penetratable 难度:**** 查看题解 - [GKCTF 2021]easycms 难度:** 查看题解
- tomcat程序闪退,如何让tomcat不闪退,可以看见报错
1.在 startup.bat 文件最后加 pause 2.cd 到tomcat bin 目录下执行 startup.bat 3.直接去Tomcat目录下的log看输出日志,即catalina.out ...
- 9.java单链表初学代码复现及一些不值一提的小问题(2)
首先写完了update和delete函数,在之前的铺垫下.倒是不难,结构和之前的都相同,遍历找到节点后处理该节点.代码如下 public void update(teamNode node){ tea ...
- Neural Network模型复杂度之Weight Decay - Python实现
背景介绍Neural Network之模型复杂度主要取决于优化参数个数与参数变化范围. 优化参数个数可手动调节, 参数变化范围可通过正则化技术加以限制. 正则化技术之含义是: 引入额外的条件, 对fu ...
- 根据Query的名字查找是那个CLF逻辑中使用
select cdodefinition.cdoname, CLFeventMap.Name "Method", CLFDefinition.CLFNAME CLF--, CLFS ...
- 解决python 操作 hbase报错:TTransportException(type=4,message=’TSocket read 0 bytes’)
```text# 解决报错:hbase报错TTransportException(type=4,message='TSocket read 0 bytes')这种情况一般协议问题和服务端没开启,如果服 ...