Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 访问扩展另一个类的类之外的变量_Java - Fatal编程技术网

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

Java 访问扩展另一个类的类之外的变量,java,Java,如何访问扩展数组列表中使用的其他类的类之外的变量?我得到一个错误,表示扩展类中不存在该变量。看一看,我想访问变量成员,而不必在对象类中声明它: public abstract class Object { public int x, y; } public class House extends Object { public int members = 10; } // Somewhere else ArrayList<Object> list = new Ar

如何访问扩展数组列表中使用的其他类的类之外的变量?我得到一个错误,表示扩展类中不存在该变量。看一看,我想访问变量成员,而不必在对象类中声明它:

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;
}
公共抽象类对象{
公共整数x,y;
}
公屋扩展对象{
公共int成员=10;
}
//其他地方
ArrayList=新建ArrayList();
添加(新房子());
用于(对象o:列表){
o、 成员;
}
问题是,在我正在编写的RTS中,我的对象类有40多个变量,只是因为仅在子类中声明它们并从外部访问它们是不可行的。
希望你能理解。我该怎么做呢?

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

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

您可以使用
instanceof
和强制转换:

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

然而,这通常被认为是糟糕的设计;您应该考虑在<代码>对象< /代码>中定义一个适当的方法(它应该确实有另一个名称,正如其他人指出的),并在<代码>房屋< /代码>中重写。然后,您可以对
对象
调用该方法,而不知道它所指的对象类型,如果它是
房屋
,则将调用正确的方法。(学习如何正确地执行此操作,以及何时执行此操作,需要一点练习-google polymorphy和overriding。)

您可以使用
instanceof
和强制转换:

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

然而,这通常被认为是糟糕的设计;您应该考虑在<代码>对象< /代码>中定义一个适当的方法(它应该确实有另一个名称,正如其他人指出的),并在<代码>房屋< /代码>中重写。然后,您可以对
对象
调用该方法,而不知道它所指的对象类型,如果它是
房屋
,则将调用正确的方法。(学习如何正确地做到这一点,以及何时做到这一点,需要一点实践——谷歌变形和覆盖。)

你必须向房子投o。例如,
((House)o)。成员

你必须向一所房子投o。例如,
((House)o)。成员

就这样投出arraylist的成员

((House)o).members;

就这样投出arraylist的成员

((House)o).members;

首先,不要给类命名
对象
(请参见注释)。您无法在代码中访问
对象的
成员
,因为对象没有字段
成员
房屋
有。但是
对象
不一定是
房屋
,因此不能保证它有
成员

如果您确定在这种情况下您是
对象
始终是一个
房子
,请将其转换为:

    ((House) anObject).member;

通过这种方式,编译器假定您比他更了解对象的实际类,并像处理
房子一样处理它。您可以使用
instanceof
检查强制转换是否有效。

首先不要命名类
对象(请参见注释)。您无法在代码中访问
对象的
成员
,因为对象没有字段
成员
房屋
有。但是
对象
不一定是
房屋
,因此不能保证它有
成员

如果您确定在这种情况下您是
对象
始终是一个
房子
,请将其转换为:

    ((House) anObject).member;

通过这种方式,编译器假定您比他更了解对象的实际类,并像处理
房子一样处理它。您可以使用
instanceof
检查强制转换是否有效。

不要命名类
对象。还有哪些类扩展了对象
?这些类也有
成员吗?@LutzHorn在我的程序中它不是真正命名的对象。是的,还有其他类可以扩展Object,我也希望这些类能够有自己的方法和变量。如果这个答案也有帮助的话,你可以看到我的答案@Er.NikhilAgrawal。你的帖子没有解决关于成员、继承和可见性的问题。不要给你的类命名
Object
。还有哪些类扩展了对象
?这些类也有
成员吗?@LutzHorn在我的程序中它不是真正命名的对象。是的,还有其他类可以扩展Object,我也希望这些类能够有自己的方法和变量。如果这有帮助的话,你可以看到我的答案@Er.NikhilAgrawal你的帖子并没有解决关于成员、继承和可见性的问题。这是一个非常有效的观点,但它没有回答问题,因此,您应该将其作为评论发布。这是一个非常有效的观点,但它不能回答问题,因此您应该将其作为评论发布。@Er.NikhilAgrawal:谢谢!谢谢你!所以我宁愿把我所有的40个变量都保存在Object中,也不愿按照你建议的方式来做;将变量保存在它们所属的类中。霍