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中,也不愿按照你建议的方式来做;将变量保存在它们所属的类中。霍