可用的私有变量

时间:2013-10-25 23:21:05

标签: java class undefined-behavior

我写了一个非常小的课程[必须成长!]但我突然看到一些“奇怪的”。

这是班级:

class Chara{
  private boolean flag_loaded;
  private boolean flag_rage, flag_shield;
  private int int_rage, int_shield;
  Chara(String fileName){
    flag_loaded = true
    if(flag_loaded){
      flag_rage = false;
      int_rage = 0;
      flag_shield = false;
      int_shield = 0;
    }
  }
  boolean rage(){return flag_rage;}
  boolean shield(){return flag_shield;}
  void add_rage(int toAdd){flag_rage = Bool(int_rage += limitMin(toAdd, 0));}
  void add_shield(int toAdd){flag_shield = Bool(int_shield += limitMin(toAdd, 0));}
  void sub_rage(int toAdd){flag_rage = Bool(int_rage -= limitMin(toAdd, 0));}
  void sub_shield(int toAdd){flag_shield = Bool(int_shield -= limitMin(toAdd, 0));}

如您所见,所有变量都设置为private

注意:limitMin()返回相同的类型变量,如果0较低,则返回toAdd。 Bool()只是一个演员。

这是一个主要部分:

Chara chara = new Chara("lol");
print(chara.int_shield, (chara.shield()) ? COL_GREEN : COL_RED);
print(chara.flag_shield, (chara.shield()) ? COL_GREEN : COL_RED);

声明,实例和打印之间没有任何操作。

这段代码应该以绿色打印盾牌的值,如果有盾牌但是它不应该打印任何东西,因为int_shieldflag_shield应该是private

结果是一个很好的0和一个漂亮的false红色......

为什么会这样? 我做错了什么?

在绝望中,我尝试制作变量protected,但正如我所料,没有发生任何事情。

编辑:添加了整个Chara课程。

1 个答案:

答案 0 :(得分:1)

您的main方法必须Chara班级或Chara班级的某个封闭班级中宣布。这可以解释为什么它可以直接访问private实例的Chara字段。在所有其他情况下,Java访问规则将阻止访问private变量。

允许内部/嵌套类访问封闭类的私有变量,反之亦然。 (至少,从“访问”规则的角度来看,它是允许的。有各种其他规则可以阻止/限制它。)

我确信这里没有“未定义的行为”。只是你不理解的行为。


如果这不能解释行为,我不明白你的问题/你的代码到底是什么样的。如果您需要进一步的帮助,请用SSCCE替换您的问题的代码片段。