我可以通过 Java 中的超类引用访问子类对象的属性吗?
Can I access a subclass object's properties through a superclass reference in Java?
假设我有一个名为 Food 的 class,在构造函数中它具有价格、卡路里数量和描述的属性。
我还有一个叫做汉堡的食物的子class,汉堡有一个额外的肉类型属性。
现在,如果我创建一个包含汉堡实例的 Food 实例数组 class,我可以通过该数组访问肉类属性的类型吗?
抱歉,如果这令人困惑,但我想知道我是否可以(以及如何)访问父子对象数组中的父子属性。我也在用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
}
在你的情况下,subclass Burger
的 meat
属性特定于该 subclass,因此唯一的选择是向下转换 Food
对象到 Burger
,在您想要访问其 Burger 特定属性时。如果您的集合(数组)包含不同的子classes,这会充满问题,因为转换可能会失败。
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)
{
...
这往往是相当脆弱的,但你不能在这里使用多态性来简化事情。运行时(动态)分派仅适用于重写的方法。相同 class 中的重载方法在编译时解析。
假设我有一个名为 Food 的 class,在构造函数中它具有价格、卡路里数量和描述的属性。
我还有一个叫做汉堡的食物的子class,汉堡有一个额外的肉类型属性。
现在,如果我创建一个包含汉堡实例的 Food 实例数组 class,我可以通过该数组访问肉类属性的类型吗?
抱歉,如果这令人困惑,但我想知道我是否可以(以及如何)访问父子对象数组中的父子属性。我也在用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
}
在你的情况下,subclass Burger
的 meat
属性特定于该 subclass,因此唯一的选择是向下转换 Food
对象到 Burger
,在您想要访问其 Burger 特定属性时。如果您的集合(数组)包含不同的子classes,这会充满问题,因为转换可能会失败。
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)
{
...
这往往是相当脆弱的,但你不能在这里使用多态性来简化事情。运行时(动态)分派仅适用于重写的方法。相同 class 中的重载方法在编译时解析。