Вопрос по instance-variables, static-variables, field, java, hiding – Скрытие полей Java

4

Мне было интересно, что значит сказать, что поле скрыто между 2 классами Java и что это значит при запуске кода с точки зрения результирующего вывода?

У меня есть абстрактный класс сprotected static boolean field = false и подкласс который имеет логическое поле с тем же именем, но не является статическим и установлен наtrue.

Если бы у меня был этот код:

<code>Superclass d = new subclass();
</code>

какое значение будет иметь логическое поле в суперклассе и логическое поле в подклассе? Поле подкласса остается какfalse после задания выше?

Большое спасибо

почему ты не попробуешь это? Sleiman Jneidi

Ваш Ответ

3   ответа
1

boolean field in the subclass?

Значениеfield переменная в суперклассе будет оставаться ложным, а значениеfield в подклассе останется верным.

Does subclass field stay as FALSE after the assignment above?

Нет. Вы не можете переопределить статические переменные в Java. То, что по существу происходит, - определение в подклассе скрывает переменную, объявленную в суперклассе.

Для хорошего примера и объяснения см.ТАК Вопрос

Я также предлагаю вам попробовать самим, чтобы увидеть, что происходит.

Спасибо Суреш за пример я пойду daveb
6

static члены никогда не переопределяются (и, конечно, не нестатическими членами). И так как вы должны получить к ним доступ, как это:ClassName.member также нет необходимости беспокоиться о том, чтобы скрыть их.

В вашем случае вы получите доступ кSuperclass поле как это:Superclass.field, И полеSubclass например, как это:subclass.field, Если у вас есть, однакоSubclass экземпляр вSuperclass переменная, как указано выше, этот код:d.field получит доступ к статическому полю, определенному вSuperclass, которые будутfalse в твоем случае.

Но это не меняет значениеSubclass Например, он просто получает доступ к & quot; неправильному & quot; член! Вы можете проверить это, поместив экземпляр вd обратно вSubclass переменная и чтениеfield снова.

Спасибо, Ролве, это действительно помогло daveb
Я добавил бы к этому, ПОЧЕМУ это происходит, поскольку я должен был искать, чтобы выяснить это. Нашел ответ здесь :(xyzws.com/Javafaq/what-is-variable-hiding-and-shadowing/15) & quot; Поскольку имена переменных в Java разрешаются ссылочным типом, а не объектом, на который они ссылаются. & quot;
10
Java Language Specification

then the declaration of that field is said to hide any and all accessible declarations of fields with the same name in superclasses, and superinterfaces of the class.

A hidden field can be accessed by using a qualified name if it is static, or by using a field access expression that contains the keyword super or a cast to a superclass type.

See more in http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html

Example Code
class A {
    static int field;
}
class B extends A {
    int field;
    void doSomething() {
        System.out.println(super.field); // From A
        System.out.println(field); // From B
    }
}
class Main {
    public static void main(String[] args) {
        B b = new B();
        System.out.println(b.field); // From B
        System.out.println(((A) b).field); // From A
        System.out.println(A.field); // From A
    }
}
Спасибо, Павел очень ценится daveb

Похожие вопросы