为什么我们要说Base b=new Derived()
与Derived b=new Derived()
?据我所知(如果我错了,请纠正我)如果我们做后者我们仍然可以将它添加到arrayList<Base>
,对吧?
答案 0 :(得分:5)
这是我最近不得不处理的一个问题。
我们说我有一个包含子类Enemy
和EnemyBlob
的父类EnemyBat
。现在假设我想将所有敌人存储在ArrayList中。如果我尝试ArrayList<EnemyBat>
,那么我需要为每种类型的敌人提供一个单独的ArrayList。
但是,如果我使用ArrayList<Enemy>
,那么我可以同时添加EnemyBlob
&{39}和EnemyBat
。
此外,这可以让您使用不同类型的对象。
ArrayList
是List
的子类。如果您定义列表为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
,将允许存储Base
,Derived
及其所有孩子。