【问题标题】:List objects from different class in Java列出Java中不同类的对象
【发布时间】: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&lt;A. list = new ArrayList&lt;A&gt;(); list.add(new B()); A obj = list.get(0); 所以obj 需要被强制转换才能被视为 B。

标签: java list class inheritance arraylist


【解决方案1】:

所有这些类都直接或间接扩展A,因此它们的所有实例都可以添加到List&lt;A&gt; 实例中。

你到底在问什么?

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 所以这意味着无论对象在声明时的引用类型是什么,我只需要确保该对象的“真实”类型来自从 A、B 或C?
    • 不完全是。如果您有A example = new B()List&lt;B&gt; lst,则不能将example 添加到lst。所以引用类型确实很重要。您必须向下转换 example 才能将其添加到 B 列表中。
    • 您需要从概念上考虑它。例如,如果您有汽车列表,则可以将沃尔沃添加到汽车列表中,但不能将汽车添加到沃尔沃列表中。
    • 我的意思是像b2(引用类型是B)和b(引用类型是A),它们可以添加到List,因为“真实”类型是A的子类。那又怎样是 B b2 = new B() 和 A b = new B() 的差;
    • 引用类型和对象类型在这里都很重要。见我上面的反例
    【解决方案3】:

    由于ABCD 都可以引用转换为A,并且myList 被强制包含A 引用,因此您的所有示例都将成功添加到列表中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      相关资源
      最近更新 更多