在Java中列出来自不同类的对象

时间:2014-05-14 15:58:50

标签: java list class inheritance arraylist

假设我有以下课程:

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));
}

3 个答案:

答案 0 :(得分:1)

他们都是正确的,因为他们都是A的子类。

答案 1 :(得分:1)

所有这些类都直接或间接地扩展A,因此可以将所有实例添加到List<A>实例。

你究竟要问的是什么?

答案 2 :(得分:0)

作为ABCD都可以被引用到AmyList被强制包含A引用,您的所有示例都将成功添加到列表中。