我写了一个非常小的课程[必须成长!]但我突然看到一些“奇怪的”。
这是班级:
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_shield
和flag_shield
应该是private
。
结果是一个很好的0
和一个漂亮的false
红色......
为什么会这样? 我做错了什么?
在绝望中,我尝试制作变量protected
,但正如我所料,没有发生任何事情。
答案 0 :(得分:1)
您的main
方法必须在Chara
班级或Chara
班级的某个封闭班级中宣布。这可以解释为什么它可以直接访问private
实例的Chara
字段。在所有其他情况下,Java访问规则将阻止访问private
变量。
允许内部/嵌套类访问封闭类的私有变量,反之亦然。 (至少,从“访问”规则的角度来看,它是允许的。有各种其他规则可以阻止/限制它。)
我确信这里没有“未定义的行为”。只是你不理解的行为。
如果这不能解释行为,我不明白你的问题/你的代码到底是什么样的。如果您需要进一步的帮助,请用SSCCE替换您的问题的代码片段。