#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 нижнего.