hiwa doski Ответов: 1

Определяется ли тип класса-члена ссылочной переменной или на что она указывает ?


в приведенном ниже примере, когда я вызываю метод foo с помощью p, он получает тот, который находится в дочернем классе, но когда я обращаюсь к переменной num, он получает тот, который находится в родительском классе, так что тип члена основан на типе ссылочной переменной или на какой объект он указывает ?

public class Main {

    public static void main(String[] args) {
    Parent p=new Child();
        System.out.println(p.num);
        p.foo();

    }

}


class Parent {
    public int num = 10;

    void foo() {
        System.out.println("Foo in parent");
    }
}


class Child extends Parent {
    public int num = 100;
    @Override
    void foo() {
        System.out.println("Foo in Child");
    }
}


Что я уже пробовал:

я не знаю, что здесь заполнять, так что это просто случайность, извините !

1 Ответов

Рейтинг:
12

Gerry Schmitz

У вас есть "переопределение" для foo; но не num; и child приводится в качестве "родителя"; так что это относится к parent.num.

Вот в чем разница.


hiwa doski

хорошо, спасибо, но еще один вопрос: допустим, дочерний класс содержит метод bar() если ссылочная переменная родительского класса указывает на дочерний объект, а этот дочерний объект содержит метод bar (), то почему мы не можем вызвать его с родительской ссылкой?

Gerry Schmitz

"Приведя" ребенка к родителю, вы ограничиваете ребенка только членами "родителя". Это "контракт", говорящий, что этот объект будет, по крайней мере, поддерживать только родительское поведение и ничего больше (и "компилятор" уважает это, хотя иногда мы можем его обмануть).

Будучи брошенным в качестве родителя, он все же остается "ребенком" и может (по-видимому) ввести переопределение в игру.

Переопределение имеет смысл, если учесть, что родительский метод может быть виртуальным или абстрактным (т. е. "заглушкой"), и переопределение должно быть соблюдено, чтобы избежать исключения "не реализовано".

hiwa doski

очень хорошо объяснил, спасибо.