[英]Having 2 variables with the same name in a class that extends another class in Java
[英]Access variables outside a class that extends another class
如何在扩展了数组列表中使用的其他类的类之外访问变量? 我收到一条错误消息,指出扩展类中不存在该变量。 看一下,我想访问变量成员而不必在我的Object类中声明它:
public abstract class Object {
public int x, y;
}
public class House extends Object {
public int members = 10;
}
// Somewhere else
ArrayList<Object> list = new ArrayList<Object>();
list.add( new House() );
for (Object o : list ) {
o.members;
}
问题是在我正在编写的RTS中,我的Object类具有40多个变量,仅因为仅在子类中声明它们并从外部访问它们是不起作用的。 希望你能理解。 我怎样才能做到这一点?
您可以使用instanceof
和强制类型转换:
for (Object o : list ) {
if (o instanceof House) {
h = (House) o;
h.members;
}
}
但是,这通常被认为是不好的设计。 您应该考虑在Object
定义一个适当的方法( 确实应该有另一个名称,正如其他人指出的那样),并在House
重写它。 然后,您可以在不知道对象所引用的对象类型的情况下在Object
上调用该方法,如果它是House
,则将调用正确的方法。 (学习如何正确执行此操作以及何时执行此操作需要一些练习-谷歌多态和重写 。)
首先,不要为您的类Object
命名(请参阅注释)。 您无法在代码中访问Object
member
,因为对象没有字段member
, House
没有。 但是Object
不必是House
,因此不能保证它有member
。
如果您确定在这种情况下,您的Object
始终是House
,则将其强制转换为:
((House) anObject).member;
这样,编译器假定您比他对Object的实际类了解更多,并且像对待House
一样处理它。 您可以使用instanceof
检查强制类型转换是否有效。
希望您理解您将类的名称用作“对象”,这是Java中所有类的父类。 现在,在您的环境中将有两个Object类,一个是Java从java.lang.Object提供的,另一个是您创建的。 因此,当您尝试访问类对象并尝试获取其对象的属性时,它实际上不是您的类对象,而是java.lang.Object的实例,因此您遇到了问题。
您必须将o投向房屋。 例如((House) o).members
只是像这样转换arraylist的成员
((House)o).members;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.