【发布时间】:2014-07-02 19:16:37
【问题描述】:
假设我有以下课程:
class B extends A
class C extends A
class D extends B
列表:
List<A> mylist,
还有来自不同类的对象:
A b = new B();
A c = new C();
B d = new D();
B b2 = new B();
以下哪项是正确的?为什么?
mylist.add(b);
mylist.add(c);
mylist.add(d);
mylist.add(b2);
这两种声明方式有什么区别:B b2 = new B() 和 A b = new B();
对象b和c的引用类型都是A,所以我觉得这两行代码是对的,对吗?另外两个呢?
之所以问这个问题是因为我想实现这个功能:
//calculate method in different class will do different calculation.
class A{
int calculate(int parameter1, int parameter2){
return parameter1*parameter2;
}
}
class B extends A{
int calculate(int parameter1, int parameter2){
return parameter1+parameter2;
}
}
class C extends A{
int calculate(int parameter1, int parameter2){
return parameter1-parameter2;
}
}
class D extends B{
int calculate(int parameter1, int parameter2){
return parameter1/parameter2;
}
}
A b = new B();
A c = new C();
B d = new D();
B b2 = new B();
List<A> mylist;
mylist.add(b);
mylist.add(c);
mylist.add(d);
mylist.add(b2);
// TODO hundreds of objects from subclass of A are added into this list
Iterator<A> iterator = mylist.iterator();
while(iterator.hasNext()){
System.out.println(iterator.calculate(2,1));
}
【问题讨论】:
-
正确是什么意思?喜欢编译吗?
-
正如其他人所说,所有这些都会编译。但请记住,在使用列表中的对象时,除非您执行 instanceof 检查并强制转换为子类,否则您将只有
A对它们的引用。 -
是的,如果它是可编译的。如果这是实现此功能的好方法。就像我需要使用来自不同类的那些对象的相同名称调用覆盖方法一样。有风险吗?
-
@DanTemple 所以即使我声明了 B b2 = new B(); ,b2的引用类型是A?
-
@JLan 如果您从
A的列表中提取它,是的。所以想一想:List<A. list = new ArrayList<A>(); list.add(new B()); A obj = list.get(0);所以obj需要被强制转换才能被视为 B。
标签: java list class inheritance arraylist