访问扩展另一个类的类之外的变量

时间:2013-05-16 14:06:04

标签: java

如何访问扩展数组列表中使用的其他类的类外部的变量?我收到一个错误,指出变量在扩展类中不存在。看一下,我想访问变量成员而不必在我的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多个变量,只是因为它不能仅在子类中声明它们并从外部访问它们。 希望你能理解。我怎么能这样做?

5 个答案:

答案 0 :(得分:8)

您可以使用instanceof和演员:

for (Object o : list ) {
    if (o instanceof House) {
        h = (House) o;
        h.members;
    }
}

然而,这通常被认为是糟糕的设计;您应该考虑在Object中定义一个合适的方法(其中真的应该有另一个名称,正如其他人指出的那样)并在House中覆盖它。然后,您可以在Object上调用该方法,而不知道它所引用的对象类型,如果它是House,则会调用正确的方法。 (学习如何正确地做到这一点,以及何时进行,需要一些练习 - 谷歌多态覆盖。)

答案 1 :(得分:3)

首先不要为您的班级Object命名(请参阅评论)。您无法访问代码中member的{​​{1}},因为对象没有Object字段,member。但House不一定是Object,因此无法保证其House

如果您确定在这种情况下member 总是一个Object,请将其投射:

House

这样编译器就会假设您对Object的实际类知之甚少,并将其处理为 ((House) anObject).member; 。您可以使用House检查演员表是否有效。

答案 2 :(得分:0)

希望您了解您正在使用您的类的名称作为'Object',它是Java中所有类的父类。现在,在您的环境中,将有两个Object类,java是java.lang.Object提供的,另一个是您创建的。因此,当您尝试访问类对象并尝试获取其属性时,它实际上不是您的类对象,而是java.lang.Object的实例,因此您遇到了问题。

答案 3 :(得分:0)

你必须把房子投到一个房子里。例如。 ((House) o).members

答案 4 :(得分:0)

像这样投下arraylist的成员

((House)o).members;