2013-10-25 1 views
0

Я написал очень маленький класс [который должен расти!], Но я вдруг вижу что-то «странное».Доступные частные переменные

Это класс:

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, но, как я и ожидал, ничего не произошло.

EDIT: добавлен весь класс Chara.

+2

Какая строка 'Chara();' в вашем коде должна делать? –

+0

Установка всех в 0 [для 'int'] и false [для 'boolean's] – ingroxd

+0

Почему? Это то, что происходит по умолчанию. Как это даже синтаксически справедливо ...? –

ответ

1

Ваш main метод обязательно быть объявлены в вашем Chara классе, или в каком-то объемлющего класса Chara класса. Это объясняет, почему он может напрямую обращаться к полям private экземпляра Chara. Правила доступа Java будут препятствовать доступу к переменной private во всех других обстоятельствах.

Внутренний/вложенный класс имеет доступ к закрытым переменным охватывающего класса и наоборот. (По крайней мере, это разрешено с точки зрения правил доступа. Существуют различные другие правила, которые могут помешать/ограничить это.)

Я уверен, что здесь нет «неопределенного поведения». Просто поведение, которое вы не понимаете.


Если это не объясняет поведение, я не понимаю ваш вопрос/как выглядит ваш код. Пожалуйста, замените фрагменты кода на свой вопрос SSCCE, если вы хотите получить дополнительную помощь.

+0

@ Деннис Мэн сделал мой день, спасибо всем вам, ребята! – ingroxd