Ссылочной переменной суперкласса может быть присвоена ссылка на любой
подкласс, производный от данного суперкласса.
Скачать исходники для статьи можно ниже
[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.