Вопрос по instance-variables, static-variables, field, java, hiding – Скрытие полей Java
Мне было интересно, что значит сказать, что поле скрыто между 2 классами Java и что это значит при запуске кода с точки зрения результирующего вывода?
У меня есть абстрактный класс сprotected static boolean field = false
и подкласс
который имеет логическое поле с тем же именем, но не является статическим и установлен наtrue
.
Если бы у меня был этот код:
<code>Superclass d = new subclass(); </code>
какое значение будет иметь логическое поле в суперклассе и логическое поле
в подклассе? Поле подкласса остается какfalse
после задания выше?
Большое спасибо
boolean field in the subclass?
Значениеfield
переменная в суперклассе будет оставаться ложным, а значениеfield
в подклассе останется верным.
Does subclass field stay as FALSE after the assignment above?
Нет. Вы не можете переопределить статические переменные в Java. То, что по существу происходит, - определение в подклассе скрывает переменную, объявленную в суперклассе.
Для хорошего примера и объяснения см.ТАК Вопрос
Я также предлагаю вам попробовать самим, чтобы увидеть, что происходит.
static
члены никогда не переопределяются (и, конечно, не нестатическими членами). И так как вы должны получить к ним доступ, как это:ClassName.member
также нет необходимости беспокоиться о том, чтобы скрыть их.
В вашем случае вы получите доступ кSuperclass
поле как это:Superclass.field
, И полеSubclass
например, как это:subclass.field
, Если у вас есть, однакоSubclass
экземпляр вSuperclass
переменная, как указано выше, этот код:d.field
получит доступ к статическому полю, определенному вSuperclass
, которые будутfalse
в твоем случае.
Но это не меняет значениеSubclass
Например, он просто получает доступ к & quot; неправильному & quot; член! Вы можете проверить это, поместив экземпляр вd
обратно вSubclass
переменная и чтениеfield
снова.
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 Codeclass 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
}
}