Проблемы с пониманием вывода набора объектов Java - PullRequest
0 голосов
/ 20 апреля 2019

Есть 4 класса:

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 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 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 Tester {
    public static void main(String[] args){
        Lower a = new Lower(1);
        Middle b = a;
        Upper c = new Middle(5);
        System.out.println(a.show());
        System.out.println(b.show());
        System.out.println(c.show());
        a.set(c);
        b.set(a);
        c.set(b);
        System.out.println(a.show());
        System.out.println(b.show());
        System.out.println(c.show());
    }
}

Я весьма смущен выводом, данным 6 операторами print в классе tester.Выходные данные: 1, 1, 5, 1, 1, 1, но я подумал, что это должно быть 1, 1, 5, 5, 5, 5.Ясно, что моя проблема заключается в понимании того, почему переменная 'a' не установлена ​​в 5 на следующей строке, когда все строки после нее, кажется, делают это.

a.set(c);

Поскольку хотя 'c' былообъявленный как тип Upper, на самом деле это переменная типа «Middle», так как в тестере было установлено значение «Middle» переменной «b».Таким образом, метод 'set', который будет использоваться, должен быть тем же классом 'Middle'.По этой логике я думал, что значение «а» будет установлено на «5», но кажется, что оно остается «1».Но я не могу понять, почему.

Любая помощь будет высоко ценится!

1 Ответ

1 голос
/ 20 апреля 2019

Ваш класс Lower не имеет метода set(Upper n), он имеет только метод set(Lower n). Поэтому, когда вы делаете вызов a.set(c);, он вынужден использовать метод set(Upper n) своего родителя (в данном случае класса Middle), который имеет set(Upper n). Это в свою очередь устанавливает j Среднего, но пропускает i Нижнего.

...