【问题标题】:Inheritance in Java regarding multiple classesJava中关于多个类的继承
【发布时间】:2014-11-12 04:03:04
【问题描述】:

假设我有一个名为 MotorVehicle 的父类,它有一些数据成员。 然后我还有两个子类 Car 和 Truck,它们扩展了父类 MotorVehicle。

现在,在我的主要方法中,我有一个 MotorVehicle 类型的 ArrayList

ArrayList<MotorVehicle> myList = new ArrayList<MotorVehicle>();

现在,我的主要方法是使用方法从 MotorVehicle 类型的 ArrayList 中的所有四个类中添加、删除、列表、保存、排序对象。

我能否将 CAR 类型的对象添加到此列表中?我真的很困惑。 下面是一个示例输入(并且创建的对象存储在 arrayList 中):

Enter what you want to do-ADD,REMOVE,LIST,SAVE,SORT: aDd Enter vehicle type- CAR, BUS, TRUCK, OTHER: CaR
Enter the number of wheels: 4
Enter the engine size in cc: 300
Enter true for power steering else false: false
Enter the purchase date as mm/dd/yyyy: 11/22/2002 Enter the vehicle serial number: ADT13478
Enter the number of doors: 2
Enter the car's color: White

以上一系列问题创建了一个CAR类型的对象,并存储在myList中。这是如何运作的? myList 不是 Car 类型。

我真的很困惑。

【问题讨论】:

  • 您为什么不尝试将Car 添加到您的ArrayList&lt;MotorVehicle&gt; 并查看它是否有效?

标签: java class inheritance extends


【解决方案1】:

是的。

由于CarMotorVehicle 作为父级,除非在Car 的声明中被覆盖,否则它将继承它的方法。 myList 不是 Car 类型,但它是 MotorVehicle 类型,并且由于 CarMotorVehicle 类型,因此可以使用它。

相反,您不能说ArrayList&lt;Car&gt; myList = new ArrayList&lt;Car&gt;();,然后将MotorVehicle 添加到列表中,因为某些类型的MotorVehicle 不是Car。所有汽车都是机动车辆,但并非所有机动车辆都是汽车。因此,如果您要对机动车辆进行分组,那么汽车可以成为其中的一部分。

这与如果您有一个名为 Fruit 的父类并且您将 ApplesOranges 作为子类的想法相同。它们都是Fruit,并且可能有colourtaste 等...但是如果你有一个Apples 数组,那么Orange 不能属于。

【讨论】:

  • 扩展混乱流。 car 类没有序列号字段,但 MotorVehicle 类有。现在,在为Car 类型创建对象时,我们被要求输入serialNumber 类型的MotorVehicle。我如何实现这一目标?添加 Car 对象和 MotorVehicle 的 serialNumber 字段?
  • 只需声明即可。 Car 扩展了 MotorVehicle,因此您可以直接声明该字段。在MotorVehicle 中声明的任何属性都将延续到Car,并且可以直接使用。如果您在子类Car 中声明该字段,它将替换属性。因此,如果您在MotorVehicle 中有int serialNumber,则如果未声明,则必须在Car 中使用int serialNumber,但如果在Car 中声明String serialNumber,则可以将字符串用于任何Car,因为它已经仅针对 Car 案例覆盖的整数要求。
  • 我想通了。我们的教授犯了错误,没有在 UML 图中指定数据成员。我完成了代码,但现在我面临另一个问题。所有这些 Car、Bus 和 Truck 都是 MotorVechile 的子类型。每当我将汽车或公共汽车或卡车的新实例添加到 motorVehicle 数组时,所有元素的 motorVechile 数据成员都会被新的值覆盖。知道我哪里出错了吗?对于汽车、公共汽车或卡车的任何对象,我正在他们的类中创建一个新的 motorVehicle 对象,然后从那里调用 MotorVehicle 的构造函数。有什么想法吗?
  • 您是否确保将数据成员应用于对象本身而不是集合。所以在CarBusTruck 的构造函数中有this.property = property 或其他任何变化。否则,您修改的是集合的全部属性,而不是单个对象。
【解决方案2】:

这就是它的行为方式。您创建了ArrayList&lt;MotorVehicle&gt; 的列表。 CarMotorVehicle 的子类,因此当您将 Car 对象添加到 MotorVehicle 列表时完全可以。

例如,您可以执行以下操作

final Car my car = new Car();
if (car instanceof MotorVehicle) { System.out.println("I am a motor vehicle"); }
if (car instanceof Car) { System.out.println("I am a car"); }

汽车是CarMotorVehicle

【讨论】:

    【解决方案3】:

    由于您定义了Car 来扩展MotorVehicle,它只是一个特定类型的MotorVehicle,因此您可以将它添加到MotorVehicles 的列表中。 当您想对列表中的对象执行某些操作时,您可能需要检查它们的具体类型,具体取决于您要执行的操作。您可以使用instanceof 来完成此操作,请参阅this 了解更多信息。

    【讨论】:

      【解决方案4】:

      此示例将帮助您了解其工作原理

      class AClass {
          public void printA() {
              System.out.println("Inside AClass.printA");
          }
      }
      
      class BClass extends AClass {
          @Override
          public void printA() {
              System.out.println("Inside BClass.printA");
          }
          public void printB() {
              System.out.println("Inside BClass.printB");
          }
      
          public static void main(String[] args) {
              ArrayList<AClass> list = new ArrayList<AClass>();
              list.add(new BClass());
      
              list.get(0).printA();
              list.get(0).printB(); //Compile time error "The method printB() is undefined for the type AClass"
      
              ((BClass) list.get(0)).printB(); //After casting it will work
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-11-11
        • 1970-01-01
        • 2011-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-22
        • 1970-01-01
        相关资源
        最近更新 更多