关于多态行为

时间:2012-12-20 11:20:13

标签: java polymorphism override

Java中的Polymorphisim代表了通过重写子类方法可以实现的许多形式。关于允许传递通用值的泛型,例如ArrayList<Object>。这是多态性概念的一部分吗? 干杯

4 个答案:

答案 0 :(得分:3)

泛型和多态是两回事。

泛型主要用于指定预期的类型。您可以使用通配符来定义一系列类型。例如。 <? extends List>可以适用于任何类型的列表(LinkedListArrayList

多态性是一个对象可以有多种类型的概念。因此,对象可以是List的实例,也可以是ArrayList的实例。

例如,想象三个类

public class Animal

public class Dog extends Animal

public class Cat extends Animal

如果您的实例为Dog,则该对象既是Dog又是Animal

显然,两者非常吻合,就好像你定义一个ArrayList<Object>那么你可以将任何Object添加到该列表中(这是Java中的任何类)

答案 1 :(得分:3)

java中的多态性可以通过java中的两种方式实现。

  1. static(重载 - 编译时)
  2. 动态(覆盖 - 运行时)
  3. 关于你的问题

    是的,可以通过重写子类中的方法来完成。您也可以在重载和覆盖的参数中使用genrics对象。

答案 2 :(得分:2)

Polymorhphism不能应用于泛型类型。 虽然String延伸Object,但ArrayList<Object>不能用于引用ArrayList<String>

Object obj = new String(); // OK
ArrayList<Object> list = new  ArrayList<String>(); // Not OK

答案 3 :(得分:1)

使用Object for polymorphism在Java中被认为是一种糟糕的模式。它没有为您提供界面给您的保证和类型安全性。

List<Object> animals = new ArrayList<Object>();
animals.add(new Sheep());
animals.add(new Cat());
// This will throw us an error! (ClassCastException)
Cat cat = (Cat) animals.get(0)

上面演示的错误无法在编译时捕获,只有在运行时发生错误时才会抛出。如果我们创建了一个Animal接口,我们可以完全避免这个错误。

interface Animal {
     //other methods you need to hide through polymorphism
     void sound();
}
List<Animal> animals = new ArrayList<Animal>();
// Sheep and Cat implement the Animal interface
animals.add(new Sheep());
animals.add(new Cat());
// No error
Animal animal = animals.get(0)
// This will through a COMPILE TIME error
Cat cat = animal.get(1);

这显示了尝试实现多态的更好方法,我们创建了一种更安全的方法,可以在编译时检查而不是在运行时。尽量避免在可能的情况下使用Object,可能有一个更好的界面,您可以根据需要设计或使用它。