有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

数组我可以通过Java中的超类引用访问子类对象的属性吗?

假设我有一个名为Food的类,在构造函数中它有price属性、卡路里属性和描述

我还有一个叫做汉堡的食物子类,汉堡还有一个额外的属性,表示肉的类型

现在,如果我创建一个包含Burger类实例的食物实例数组,我可以通过该数组访问肉类类型属性吗

很抱歉,这让人困惑,但我想知道我是否可以(以及如何)访问父对象和子对象数组中的父属性和子属性。我也在使用Java


共 (2) 个答案

  1. # 1 楼答案

    即使存储在Food数组中,也可以访问Burger的属性。首先,您需要将其强制转换为Burger,以便您的程序知道它是什么类型。由于Food数组中并非所有对象都是Burger,因此最好先检查其类型。比如:

    Food[] myFoods; //your food array
    if (Burger.isInstance(myFoods[0])) { //check that the Food is a Burger
     ((Burger)myFoods[0]).meatType; //cast the object to a Burger and access its property
    }
    
  2. # 2 楼答案

    在您的例子中,子类Burgermeat属性特定于该子类,因此唯一的选项是在您想要访问其特定于汉堡的属性时,将Food对象向下转换为Burger。如果您的集合(数组)包含不同的子类,这将充满问题,因为强制转换可能会失败

    Food[] foods = new Food[n];
    Food[0] = new Burger(...);
    Food[1] = new Vegetable(...);
    Meat m1 = ((Burger)foods[0]).getMeat(); // This is OK
    Meat m2 = ((Burger)foods[1]).getMeat(); // ClassCastException
    

    或者更好

    for (Food f : foods)
    {
        if (f instanceof Burger)
        {
            Meat m = ((Burger)foods[0]).getMeat(); 
            // other Burger-related processing
        }
        else if (f instanceof ...someothersubclass)
        {
             ...
    

    这往往很脆弱,但在这里不能使用多态性来简化事情。运行时(动态)分派仅对重写的方法有效。在编译时解析同一类中的重载方法