为什么多态在Java中有用?

时间:2014-04-17 00:10:23

标签: java polymorphism

为什么我们要说Base b=new Derived()Derived b=new Derived()?据我所知(如果我错了,请纠正我)如果我们做后者我们仍然可以将它添加到arrayList<Base>,对吧?

3 个答案:

答案 0 :(得分:5)

这是我最近不得不处理的一个问题。

我们说我有一个包含子类EnemyEnemyBlob的父类EnemyBat。现在假设我想将所有敌人存储在ArrayList中。如果我尝试ArrayList<EnemyBat>,那么我需要为每种类型的敌人提供一个单独的ArrayList。

但是,如果我使用ArrayList<Enemy>,那么我可以同时添加EnemyBlob&{39}和EnemyBat

此外,这可以让您使用不同类型的对象。

ArrayListList的子类。如果您定义列表为ArrayList的所有地点,那么如果您获得不同类型的List(例如CopyOnWriteArrayList),那么您将不会成为能够使用它。

基本上,多态性可以灵活地使用和覆盖类。

答案 1 :(得分:1)

这些之间没有区别:

Base b = new Derived();
list.add(b);

// or

Derived b = new Derived();
list.add(b);

所以请根据自己的喜好使用。

其他情况有所不同 - 以下是一些例子:

// this works fine
Base b;
if(randomNumber > 5)
    b = new Derived1();
else
    b = new Derived2();

// this does not compile
Derived1 b;
if(randomNumber > 5)
    b = new Derived1();
else
    b = new Derived2();

// this also works fine, but if you change Base to Derived1 it will not compile
void foo(Base b) {
    System.out.println("Type is "+b.getClass().getName());
}
void bar() {
    foo(new Derived1());
    foo(new Derived2());
}

答案 2 :(得分:0)

你是对的,但是将数组列表声明为取Base,将允许存储BaseDerived及其所有孩子。