Какие переопределенные методы вызываются?

Мне трудно понять решение данного вопроса. Я не могу понять на каждом шагу, какой из методов класса вызывается.

Я попытался составить список объявленных типов a, b, c и фактических типов, а затем попытался выбрать переопределенные или перегруженные методы, но это сложно.

class Upper {

    private int i;

    private String name;

    public Upper(int i) {
        name = "Upper";

        this.i = i;
    }

    public void set(Upper n) {
        i = n.show();
    }

    public int show() {
        return i;
    }

}

class Middle extends Upper {
    private int j;

    private String name;

    public Middle(int i) {

        super(i + 1);

        name = "Middle";
        this.j = i;
    }

    public void set(Upper n) {
        j = n.show();
    }

    public int show() {
        return j;
    }

}

class Lower extends Middle {


    private int i;

    private String name;

    public Lower(int i) {

        super(i + 1);
        name = "Lower";
        this.i = i;
    }

    public void set(Lower n) {
        i = n.show();
    }

    public int show() {
        return i;
    }

}

class Tester {

    public static void main(String[] args) {
    Lower a = new Lower(1);

    Middle b = a;

    Upper c = new Middle(5);



    a.set(c);

    b.set(a);

    c.set(b);

    System.out.println(a.show());
    System.out.println(b.show());
    System.out.println(c.show());

    }

}

Что печатается в результате System.out.println(a.show()); после заданных команд? Ответ 1

Что печатается в результате System.out.println(b.show()); после заданных команд? Ответ 1

Что печатается в результате System.out.println(c.show()); после заданных команд? Ответ 1

Я не понимаю, почему ответы на все эти вопросы равны 1. Также я не могу сказать, какой класс переопределяет или перегружает методы, которые "a.set(c); b.set(a); c.set(b); " использует. Подробное объяснение было бы очень полезно.


person Egeio    schedule 24.04.2019    source источник
comment
Вероятно, самое время изучить, как отлаживать ваш код.   -  person Lino    schedule 24.04.2019
comment
В коде нет ничего плохого. Речь идет о вопросах ниже.   -  person Egeio    schedule 24.04.2019
comment
Инструмент отладки позволяет вам следить за оператором кода за оператором. Таким образом, вы сможете увидеть, какие методы вызываются.   -  person AxelH    schedule 24.04.2019
comment
@Egeio Точно, и вы спрашиваете Почему ответ всегда 1? Путем отладки вы можете пройтись по своему коду и сразу же увидеть, какие значения передаются, какие хранятся в полях... и т. д.   -  person Lino    schedule 24.04.2019
comment
Спасибо за рекомендации очень помогли. Сейчас попробую отладчиком.   -  person Egeio    schedule 24.04.2019


Ответы (1)


a.set(c) использует метод set из Middle, поскольку он переопределяет метод из Upper, а (перегруженный) набор из Lower неприменим, поскольку c не является экземпляром Lower.

Поэтому для j установлено значение c.show(), которое возвращает атрибут c j, поэтому он будет установлен на 5. Следовательно, (нижний) атрибут i элемента a никогда не затрагивается и остается равным 1, когда он отображается и печатается.

Остальные попробуйте решить самостоятельно.

person floxbr    schedule 24.04.2019