Я думал, что понял концепцию затенения. Но этот код заставил меня задуматься:Тень/Область переменных
public class Counter {
int count = 0;
public void inc() {
count++;
}
public int getCount() {
return count;
}
}
class StepCounter extends Counter {
int count = 0;
int step = 1;
public StepCounter(int step) {
this.step = step;
}
public void inc() {
count += step;
}
}
StepCounter sc = new StepCounter(2);
sc.inc();
sc.inc();
System.out.println(sc.getCount());
System.out.println(sc.count);
Так в основном статический тип скандий StepCounter
. Счетчик увеличивается в два раза, поэтому после первых двух команд он равен 4. Мой счетчик Variable не является частным, он является закрытым пакетом (поскольку я не указал на него видимость). Так что, если я вызываю метод .getCount()
на sc, он сначала ищет его в StepCounter. Его нет, поэтому он идет к Counter. Здесь он находит метод getCount()
. этот способ возвращает счет. Если счет был статичным или закрытым, я бы понял, почему он возвращает 0. Но почему он возвращает 0 в этом случае? Даже если я сделал счетчик переменных в StepCounter
, результат будет равен 0.
Поскольку переменные-члены не являются полиморфными. Counter.getCount всегда возвращает Counter.count. –
Связанный: http://stackoverflow.com/questions/32422923/why-does-java-bind-variables-at-compile-time – manouti
Также поле здесь не затенено. Он скрыт. – manouti