关于多态 List

问题描述

之前声明一个List的时候都是List list = new ArrayList(); 一直没考虑过为什么要这么做,这样从多态的角度看有什么好处。 问题补充:hudingchen 写道

解决方案

引用之前声明一个List的时候都是List list = new ArrayList(); 一直没考虑过为什么要这么做,这样从多态的角度看有什么好处。对于List list = new ArrayList();这种写法,你使用list时只能使用List接口本身的方法(编译期);在运行期,jvm会根据具体的实现来选择某一特定的类,但是这本身会消耗一定的性能,可参考Java method invoke的指令简介 。但是这能够带来什么样的好处呢?你可以在你的业务需要变化的时候,很方便的替换你的实现,比如List list = new LinkedList();,不必为了引入ArrayList特有的方法而烦恼,即多态的概念。(当你使用ArrayList list = new ArrayList();时,并且使用ArrayList特有的方法时)最后,要以辩证的思维来分析问题,问题本身并不是绝对的,解决问题的方案也不是绝对的,会随着时间、业务等因素的变化而变化的,你要做的就是按理出牌。
解决方案二:
引用恩 对于List list = new ArrayList(); 为什么不直接声明为 ArrayList list = new ArrayList(); 这样不是直接点吗,也带有List 的相关特性。如果你以后想换个实现换成LinkedList呢?如果你是以接口声明的,那么直接替换实现就可以了,如果你是以上述方式声明,那么你得在程序其它引用到它的地方都得修改。
解决方案三:
还是多态阿List list = new ArrayList(); 哪天你不想用ArrayList了,换用其他对象比如LinkedList,Vector,那么直接写List list = new LinkedList(); list对象没有变化,还是List。拿上面车的例子说,你每天上班都坐轿车,突然有一天轿车坏了,就换了自行车,这个时候你使用的还是车(不管什么车)。
解决方案四:
ArrayList实现了List接口,List list = new ArrayList();这么写,list对象就具备List的特性,可以调用List相关方法。多态,举个例子:有一个车的接口,它下面有轿车,自行车,三轮车,他们都实现了车的接口,如果你想要所有的车都出勤,那你可以说:“所有的车出勤”,而不必说:"轿车,自行车三轮车出勤"。

时间: 2024-11-23 23:38:49

关于多态 List的相关文章

C#多态小结——面向对象编程的三大机制之二

C#的多态性: 我的理解是:同一个操作,作用于不同的对象时,会有不同的结果,即同一个方法根据需要,作用于不同的对象时,会有不同的实现. C#的多态包括:接口多态,继承多态. 其中继承多态又包括通过虚拟方法实现的多态和通过抽象方法实现的多态性 例如:基类动物都有吃的方法,但是不同的动物吃的东西就会不一样,例如狼吃肉,羊吃草,这样"吃"的这个方法就要在派生类里面重新实现以下,运行时,通过指向基类的指针,来调用实现派生类中的方法. 接下来举例实现多态性. 1. 接口多态性 把动物"

Python编程之多态用法实例详解

  本文实例讲述了Python编程之多态用法.分享给大家供大家参考.具体分析如下: 什么是多态?顾名思义,多态就是多种表现形态的意思.它是一种机制.一种能力,而非某个关键字.它在类的继承中得以实现,在类的方法调用中得以体现.多态意味着变量并不知道引用的对象是什么,根据引用对象的不同表现不同的行为方式. 我们先看一个简单的例子,运算符多态: ? 1 2 3 4 5 6 a=34 b=57 print(a+b) a="世界" b="你好" print(a+b) 我们不知

JAVA多态示例

1 class SuperClass 2 { 3 public void test() 4 { 5 System.out.println("SuperClass"); 6 } 7 } 8 class SubClass1 extends SuperClass 9 { 10 public void test() 11 { 12 System.out.println("SubClass1"); 13 } 14 } 15 class SubClass2 extends Su

javascript面向对象中多态和泛型的关系

在大家看到我的这篇文章时,我正在拜读刘未鹏先生写的<暗时间>,如果你有幸看到我的这篇博客,我希望你也可以看看这本书.好了闲话少叙,进入正题. 在面向对象的Collection中处处体现泛型和多态的思想,且慢,由于泛型和多态两者之间本身就有一定的相似性,让我们先认清楚泛型和多态之后再进入话题. 多态是面向对象最基本的概念之一,即要模糊父类和之类之间的区别,如何模糊呢?我们再来举网络上的那个例子: class Aninal{ 叫:}//叫是动物的一个方法 class 猫 extend Animal

小心重写方法,正确实现多态

这是我今天在工作中碰到的问题,是关于继承和多态的.同事对项目中的一项基础功能进行了重构,可是当我们从CVS服务器上更新了项目源代码并编译了之后,发现这项功能已不能正常工作了.先撇开这个同事所犯的错误(对代码进行重构后没有测试他的新代码就上传到了CVS服务器上)不说,在这里我就说说这个问题所带出来的JAVA konwhow.由于我们的项目比较复杂,我在这里采取比较简单的例子来讲解这个问题.首先,我们有2个类:supper.TestSupper.java 和sub.TestSub.java.他们的代

漫谈C#编程中的多态与new关键字

编程|关键字 1. 你通常怎样用多态? 假设我有一个类,里面有一个 PrintStatus 方法,用于打印实例的当前状态,我希望该类的派生类都带有一个 PrintStatus 方法,并且这些方法都用于打印其实例的当前状态.那么我会这样表达我的愿望: // Code #01 class Base{ public virtual void PrintStatus() { Console.WriteLine("public virtual void PrintStatus() in Base"

《Java编程思想》(第二版)第7章:多态(polymorphism)

编程 封装,继承与多态是OOP的三个核心本质. Method-call(函数调用)绑定方式:如果绑定动作发生于程序执行前(由编译器和连接器完成),成为"先期绑定(early binding)"绑定动作将在执行期才根据对象型别尔进行,称为后期绑定late binding,或者执行期绑定run-time binding,或者动态绑定dynamic binding.Java运用RTTI(run-time type identification)技术来支持动态绑定. 上一章提到的final关键

vb.net类的封装,继承,多态,抽象之一

封装|继承   封装就是把各种方法和变量合并到一个类,用这个类代表某个对象为完成一定的任务所能保存的范围以及它能执行的操作. 继承就是根据现有类的方法和成员变量生成新的类的功能 多态就是对象随着程序执行而使其形式发生改变的能力. 抽象就是在暂时忽略对象的具体细节的功能. 在类中,构造器的方法使简化类的成员变量的初始化处理,当用继承从一个类构造另一个类的时候,会有两套构造器发生作用,即基类构造器和派生类构造器 例如: Public Class Form1    Inherits System.Wi

ASP.NET入门随想之多态、接口与委托

asp.net     曾几何时,我们居住的陆地沉睡在海底,大陆也紧密的联系在一起,千百年过去了七大洲的地壳板块在缓缓移动,喜马拉雅山在慢慢增高,世界在变,唯一不变的是变化. ■ 软件开发的悖论 - 把变化变成计划 在软件开发活动的过程中,常被一个悖论所缠绕:不写码就搞不清该做什么:搞不清做什么又不知道该如何写码. 人的思维是很随意的东西,不同的人,或同一个人的不同阶段,对同一件事情的看法都会有差异,可谓是远看成岭侧成峰,远近高低各不同.随意再加上变化,常常引起项目流产或工期大大拖延. 之所以会

C++:显示接口&amp;amp;运行期多态 和 隐式接口&amp;amp;编译期多态

类(class)和面向对象: 显示接口(explicit interface): 即在源代码中可见, 可以在头文件内看到类的所有接口; 运行期多态(runtime polymorphism):成员函数是virtual, 传入类的引用或指针时, 在运行时, 会自动匹配接口, 可能是基类的接口, 也可能是派生类的; 模板(templates)和泛型编程(generic programming): 隐式接口(implicit interface):typename T, 在函数中, 所必须支持一组操作