关于java:可用的私有变量

Available private variables

本问题已经有最佳答案,请猛点这里访问。

我写了一个非常小的班级[必须成长!]但我突然看到一些"奇怪"的东西。

这是课程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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()返回同一类型变量,如果toAdd较低,则返回0。bool()只是一个演员表。

这是一个主要部分:

1
2
3
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类。


您的main方法必须在您的Chara类中声明,或者在Chara类的某个封闭类中声明。这就解释了为什么它可以直接访问Chara实例的private字段。Java访问规则将阻止在所有其他情况下访问EDCOX1×3变量。

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

我敢肯定这里没有"不明确的行为"。只是你不理解的行为。

如果这不能解释行为,我不理解您的问题/您的代码实际上是什么样子的。如果您需要进一步的帮助,请用SSCCE替换您问题的代码段。