繁体   English   中英

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

[英]Can I access a subclass object's properties through a superclass reference in Java?

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

我还有一个名为Burger的Food子类,而Burger还有一个属于肉类的附加属性。

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

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

您可以访问Burger的属性,即使它存储在Food数组中。 首先,您需要将其转换为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
}

在您的情况下,子类Burgermeat属性特定于该子类,因此唯一的选择是在您想要访问其Burger特定属性时将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)
    {
         ...

这往往相当脆弱,但你不能使用多态来简化这里的事情。 运行时(动态)调度仅适用于重写方法。 在编译时解析同一类中的重载方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM