我可以访问子类对象';在Java中,通过超类引用定义属性?

我可以访问子类对象';在Java中,通过超类引用定义属性?,java,arrays,constructor,instance,parent,Java,Arrays,Constructor,Instance,Parent,假设我有一个名为Food的类,在构造函数中它有price属性、卡路里属性和描述 我还有一个叫做汉堡的食物子类,汉堡还有一个额外的属性,表示肉的类型 现在,如果我创建一个包含Burger类实例的食物实例数组,我可以通过该数组访问肉类类型属性吗 很抱歉,这让人困惑,但我想知道我是否可以(以及如何)访问父对象和子对象数组中的父属性和子属性。我也在使用Java。您可以访问汉堡的属性,即使它存储在食物数组中。首先,您需要将其强制转换为汉堡,以便您的程序知道它是什么类型。由于食物数组中并非所有对象都是汉堡,

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

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

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


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

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

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
}

在您的例子中,子类
Burger
meat
属性特定于该子类,因此唯一的选项是在您想要访问其特定于汉堡的属性时,将
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)
    {
         ...

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

您必须强制转换:((Burger)foods[index])。getMeatTypeA构造函数没有属性。只有对象实例具有属性。您的问题应该是“我可以通过超类引用访问子类对象的属性吗”Sweet,谢谢。你能解释一下到底发生了什么吗?食物实例是否被转换为汉堡实例?谢谢你的澄清。那么一个构造函数有属性,而一个对象有属性。属性和属性是一样的。构造函数是一种可执行方法,只有对象实例具有属性(静态属性实际上属于类本身)。请参阅下面我的答案,以讨论您的问题。谢谢!这很有道理。我现在有两个独立的数组,但现在我只能有一个对象数组。@Skistar002很乐意帮忙!如果这解决了你的问题,我将非常感谢你的支持或接受。