What is the benefit of polymorphism using Collection interface to create ArrayList object?
我研究了多态性并理解它可以像下面这样做动态方法绑定。
假设类动物是抽象类。
1 2 3 4 5 6 7 8 9 10 11 | public class AnimalReference { public static void main(String args[]) Animal ref // set up var for an Animal Cow aCow = new Cow("Bossy"); // makes specific objects Dog aDog = new Dog("Rover"); // now reference each as an Animal ref = aCow; ref.speak(); ref = aDog; ref.speak(); } |
我曾经创建过arraylist实例,比如:
但通常我认为人们会写:
1 |
所以我的困惑是,将其声明为集合有什么好处?另外,我不知道在"mylist"前面可以有"collection"(接口而不是抽象类)。
为什么说:
我阅读收集接口和ARAYLIST Java文档以及在线教程,但仍然不是很清楚。有人能给我解释一下吗?
如果你declare
值得注意的是
它的probably更普通的写
这aside,原是用一种抽象的概念,或实施的独立性。做我真的关心,如果我有列表是一个
"我们是简单的比方,你写的程序,采用全
也,有时在执行级的东西可能不会是你想要能或进出使用。例如,当使用一种持续性hibernate provider类,这类实际的
如果你是一declaring
值得注意的是,如果你declare的一种方法是以一种
作为一种债券的音符,考虑使用泛型。 </P >
编辑:有说是仿制药,也introduces一些陷阱。 </P >
好吧,数组列表有一个动态大小。集合没有编译时检查,它必须是强制类型化的。集合只包含引用的对象。你可以把收藏看作是一个"包"。并且可以对整个对象执行操作。我还确信,与数组列表相比,集合的搜索时间很短,但不是正的。arraylist有更多的功能和方法可以调用。
在局部变量声明中使用的类型(如在ArrayList中)例)通常不那么重要。你要确保的就是MyList的类型(名称"MyList"左侧的单词)具有比任何接受MyList.
考虑:
1 2 3 4 5 6 7 | ArrayList words = new ArrayList(); sort(words); removeNames(words); public void sort(Collection c) ... blah blah blah public void removeNames(List words) ... |
我本来可以把"单词"的类型改成列表。它不对程序的可读性或行为有任何区别。但我不能把"单词"定义为宾语。这太笼统了。
在相关注释中,定义公共方法时,应仔细考虑方法参数的类型,因为这对呼叫者可以传递的内容有直接影响。如果我定义分类不同:
1 2 3 4 5 6 | ArrayList words = new ArrayList(); // this line will cause a compilation error. sort(words); public void sort(LinkedList c) ... blah blah blah |
分类的定义现在非常严格。在第一个例子中,sort方法允许任何对象作为参数,只要它实现集合。在第二个示例中,sort只允许LinkedList,它将不接受任何其他内容(arraylist、hashset,Treesets和许多其他)。排序方法可以使用现在相当有限。这可能是有充分理由的;Sort的实现可能依赖于LinkedList的特性数据结构。如果人们使用此代码需要一个排序算法,该算法适用于除链接列表。
编写Java库的主要技巧之一是决定类型。方法参数。你想成为什么样的将军?
首先,继承和接口之间存在显著差异。一个简短的回溯历史:在普通的C++中,你可以从多个类继承。如果一个"transformer"类继承自"vehicle"和"human",这会产生负面影响,这两个类都实现了一个名为"moveforward"的方法。如果在"Transformer"类上调用此方法,实例应该使用哪个函数?"人"还是"车"的实施?为了解决这个问题,接口由Java,C….Interfaces是类与其他对象之间的契约。您对功能作出了承诺,但契约没有为您的类实现任何逻辑(以防止transformer.moveforward"问题)。
多态性通常意味着某些东西可以以不同的方式出现。"变压器"可以是"车辆"和"人"。根据您的语言(我使用C),您可以根据您想要履行的合同实施不同的"前进"行为。
使用接口而不是具体的实现有几个优点。首先,您可以在不更改代码的情况下切换实现(GoogleLookup;的依赖项注入)。其次,您可以使用测试框架和模拟框架更容易地测试代码。第三,使用最通用的接口数据交换(如果只想在值上进行交互,则使用列表的枚举器instad)是一个很好的实践。
希望这有助于理解接口的优点。
通过declaring和使用