Java Урок 36: НАСЛЕДОВАНИЕ, ссылка переменной суперкласса на объект подкласса

Ссылочной переменной суперкласса может быть присвоена ссылка на любой
подкласс, производный от данного суперкласса.

Скачать исходники для статьи можно ниже

[sape]

Ссылочной переменной суперкласса может быть присвоена ссылка на любой
подкласс, производный от данного суперкласса.
Этот аспект наследования будет весьма полезен во множестве ситуаций.
.
.
.
.
Рассмотрим следующий пример:

class Box{
   double width;
   double height;
   double depth;
   // вычисление и возврат объема
   double volume(){
      return width * height * depth;
   }
}

class BoxWeight extends Box {
   double weight; // вес параллелепипеда
   // конструктор BoxWeight
   BoxWeight(double w, double h, double d, double m) {
      width = w;
      height = h;
      depth = d;
      weight = m;
   }
}

class RefDemo {
   public static void main(String args[]) {
      BoxWeight weightbox = new BoxWeight(3, 5, 7, 8.37);
      Box plainbox = new Box();
      double vol;
      vol = weightbox.volume();
      System.out.println("Объем weightbox равен " + vol);
      System.out.println("Beс weightbox равен " + weightbox.weight);
      System.out.println();
      // присваивание ссылке на объект BoxWeight 
       // ссылки на объект Box
      plainbox = weightbox;
      vol = plainbox.volume(); // OK, метод volume() определен в Box
      System.out.println("Объем plainbox равен " + vol);
      // Следующий оператор ошибочен, поскольку plainbox
      // не определяет член weight. 
   // System.out.println("Вес plainbox равен " + plainbox.weight);
   }
}

В этом примере weightbox — ссылка на объекты класса BoxWeight, a painbox — ссылка на объекты класса Box.

Поскольку BoxWeight — подкласс класса Box, ссылке painbox можно присваивать ссылку на объект weightbox.

Важно понимать, что доступные объекты определяются типом ссылочной переменной, а не типом объекта, на который она ссылается. То есть при присваивании ссылочной переменной суперкласса ссылки на объект подкласса доступ предоставляется только к указанным в ней частям объекта, определенного суперклассом.

Именно поэтому объект plainbox не имеет доступа к переменной
weight даже в том случае, когда он ссылается на объект класса BoxWeight.

Если немного подумать, это становится понятным — суперклассу неизвестно, что именно подкласс добавляет в него. Поэтому последняя строка кода в предыдущем фрагменте оформлена в виде комментария. Ссылка объекта класса Box не имеет доступа к полю weight, поскольку оно не определено в классе Box.

Введите свой email адрес для того, чтобы подписаться на мой блог:


knopkisoc

Добавить комментарий