Проблемы с пониманием выходных данных набора объектов Java

#java #inheritance #subtyping

#java #наследование #подтипы

Вопрос:

Существует 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 операторами печати в классе tester. Выдаваемый результат 1, 1, 5, 1, 1, 1 но я думал, что так и должно быть 1, 1, 5, 5, 5, 5 вместо этого. Итак, очевидно, что моя проблема заключается в понимании того, почему переменная ‘a’ не получает значение 5 в следующей строке, когда кажется, что все строки после нее делают это.

 a.set(c);
  

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

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

Ответ №1:

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