Попытка понять повышение уровня на Java. Недавно наблюдалось странное поведение.
Пример:
public class A extends B {
public int i = 2;
public void printI() {
System.out.println("print i = " + this.i);
}
public static void main(String[] args) {
B a = new A(); // <- upcasting here
System.out.println("i = " + a.i);
a.printI();
}
}
class B {
public int i = 1;
public void printI() {}
}
//Output:
//i = 1
//print i = 2
Кажется, что объект с повышением уровня имеет два отдельных свойства "i" . Один "i" доступен непосредственно (a.i), а другой - с помощью методов дочернего класса (a.printI()).
Похоже, что объект с повышением уровня получает свойства суперкласса и методы из дочернего класса.
Как объект может иметь два отдельных "i" s?!
Кажется, что объект с повышением уровня имеет два отдельных свойства "i".
Во-первых, стоит упомянуть терминологию. Нет такой вещи, как "объект с повышенным интересом" - и "i" - это поле в каждом из A
и B
.
Но да, здесь есть два отдельных поля. Это не похоже на то, что одно поле "переопределяет" другое или что-то в этом роде.
Непонятно, чего вы пытались достичь, но объявление i
в A
тени объявление i
в B
. См. раздел 6.4 Спецификации языка Java для получения дополнительной информации.
Обратите внимание, что почти во всех случаях поля должны быть частными - в этот момент скрытие действительно не имеет значения, поскольку вы не пытались бы ссылаться на переменную, которая не была объявлена в классе, который вы кодируете в в любом случае.
Как работает Java. У вас есть оба поля "доступны", у них просто одноименное имя. Когда вы ссылаетесь на подкласс, он скрывает версию суперкласса, но он все еще существует.