我试图从我的类stay
访问一个布尔变量MontyHall
,但不能,因为它是非静态的,我试图在静态上下文中访问它
这是代码:
public void updateStatistics(Door door1, Door door2, Door door3)
{
this.numGames = this.numGames + 1;
oneDoor(door1, 0);
oneDoor(door2, 1);
oneDoor(door3, 2);
if (MontyHall.stay == true){
this.numStay = this.numStay + 1;
}
else{
this.numSwitch = this.numSwitch + 1;
}
}
变量停留位于班级MontyHall
。任何帮助将不胜感激,因为我很困惑如何解决这个问题
类MontyHall
的属性:
public class MontyHall {
boolean stay;
Door A = new Door("A");
Door B = new Door("B");
Door C = new Door("C");
public MontyHall(Door a, Door b, Door c){
this.A = a;
this.B = b;
this.C = c;
}}
答案 0 :(得分:1)
您的代码MontyHall.stay
是您尝试静态引用它的部分(通过使用类名称)。
非静态字段需要实例化对象才能引用。在这种情况下,如果此方法在MontyHall中,那么您可以使用this.stay
来访问它,而不是MontyHall.stay
。如果您上面列出的方法不在MontyHall类中,那么您需要创建一个新的MontyHall对象,如:MontyHall montyHall = new MontyHall();
或者,您可能希望将stay
变量设为静态,在这种情况下,只需在变量声明中添加一个简单的static
关键字。
答案 1 :(得分:1)
我试图从我的类MontyHall访问一个布尔变量,但不能,因为它是非静态的,我试图在静态上下文中访问它
现在一切都很清楚了。您的变量stay
是一个实例变量,它属于类MontyHall
的每个单独对象。因此,您不应该考虑将static
仅用于解决错误。
要访问实例变量,您需要先创建一个对象。 (因为它属于特定对象而不属于类):
MontyHall hall = new MontyHall();
hall.stay; //access stay from object of MontyHall
在数据保护和封装规则中,您可以考虑将stay
变量 私有 并使用getters
和setters
访问它。
因此,如果您将stay
设置为私有,则可以像这样访问它:
hall.getStay();
最后但并非最不重要的是,Java没有全局变量。将类变量(静态变量)视为全局变量是一种相当普遍的误解。
答案 2 :(得分:0)
您无法从非静态上下文中访问变量。您必须首先实例化该类,然后从该实例访问bariable。所以它会是这样的:
MontyHall a = MontyHall();
a.someVariable....
注意:变量应该可以从其他类访问(根据情况建议封装)。
此主题中的更多信息:calling non-static method in static method in Java
答案 3 :(得分:-1)
您希望直接从类访问变量,而无需创建实例。为此,应将变量声明为static
。在该类中,您应该如下定义:
public class MontyHall {
public static boolean stay = true;
.....
}
现在您可以按照自己的方式访问它。
修改强>
或者,正如其他人所提到的那样。如果stay
是一个可以在您的类中更改的变量,则应首先创建一个实例。
MontyHall a = new MontyHall(....);
a.stay; // This is the stay variable from MontyHall a
MontyHall b = new MontyHall(....);
b.stay; // This stay variable could have a different value