从静态上下文访问非静态变量

时间:2016-02-03 00:19:28

标签: java

我试图从我的类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;
  }}

4 个答案:

答案 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变量 私有 并使用getterssetters访问它。

因此,如果您将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