Обновление в Java и два отдельных свойства объекта

1

Попытка понять повышение уровня на 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?!

  • 0
    Это разные классы - даже если один происходит от другого, ничто не исключает наличия у вас элементов данных с одинаковыми именами (немного глупо ...)
Теги:
oop
upcasting

2 ответа

5
Лучший ответ

Кажется, что объект с повышением уровня имеет два отдельных свойства "i".

Во-первых, стоит упомянуть терминологию. Нет такой вещи, как "объект с повышенным интересом" - и "i" - это поле в каждом из A и B.

Но да, здесь есть два отдельных поля. Это не похоже на то, что одно поле "переопределяет" другое или что-то в этом роде.

Непонятно, чего вы пытались достичь, но объявление i в A тени объявление i в B. См. раздел 6.4 Спецификации языка Java для получения дополнительной информации.

Обратите внимание, что почти во всех случаях поля должны быть частными - в этот момент скрытие действительно не имеет значения, поскольку вы не пытались бы ссылаться на переменную, которая не была объявлена ​​в классе, который вы кодируете в в любом случае.

1

Как работает Java. У вас есть оба поля "доступны", у них просто одноименное имя. Когда вы ссылаетесь на подкласс, он скрывает версию суперкласса, но он все еще существует.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню