<
  • Главная
Статьи

Java Урок 37: НАСЛЕДОВАНИЕ, ключевое слово super

Опубликовано: 01.09.2018

видео Java Урок 37: НАСЛЕДОВАНИЕ, ключевое слово super

Урок по Java 21: Enums - перечесления

В предшествующих примерах классы, производные от класса Box, были реализованы не столь эффективно и надежно, как могли бы. Например, конструктор BoxWeight() явно инициализирует поля width, height и depth класса Box. Это не только ведет к дублированию кода суперкласса, что весьма неэффективно, но и предполагает наличие у подкласса доступа к этим членам.



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

Однако в ряде случаев придется создавать суперкласс, подробности реализации которого доступны только для него самого (т.е. с закрытыми членами данных). В этом случае подкласс никак не может самостоятельно непосредственно обращаться к этим переменным или инициализировать их.


10. (2016) Переопределение методов. Наследование от класса object. Extends. Оператор instanceof

Поскольку инкапсуляция — один из главных атрибутов ООП, не удивительно, что язык Java предлагает решение этой проблемы.

Во всех случаях, когда подклассу нужно сослаться на его непосредственный суперкласс, это можно сделать при помощи ключевого слова super.

Урок 10. Основы JAVA. Исключения (Exception) и методы их обработки. Операторы try…catch

Ключевое слово super имеет две общие формы.

Первую используют для вызова конструктора суперкласса, а вторую — для обращения к члену суперкласса, скрытому членом подкласса. Рассмотрим обе формы.

Использование ключевого слова super для вызова конструкторов суперкласса.

Подкласс может вызывать конструктор, определенный его суперклассом, с помощью следующей формы ключевого слова super.

super (список_аргументов) ;

Здесь список_аргументов определяет любые аргументы, требуемые конструктору в суперклассе. Вызов метода super() всегда должен быть первым оператором, выполняемым внутри конструктора подкласса.

В качестве иллюстрации использования метода super() рассмотрим следующий пример:

// Теперь класс BoxWeight использует ключевое слово super // для инициализации своих атрибутов объекта Box. class BoxWeight extends Box { double weight; // вес параллелепипеда // инициализация переменных width, height и depth с помощью super() BoxWeight(double w, double h, double d, double m){ super(w, h, d); // вызов конструктора суперкласса weight = m; } }

В этом примере конструктор BoxWeight() вызывает метод super() с аргументами w, h и d. Это приводит к вызову конструктора Box(), который инициализирует переменные width, height и depth, используя переданные ему значения соответствующих параметров.

Теперь класс BoxWeight не инициализирует эти значения самостоятельно. Ему нужно инициализировать только свое уникальное значение — weight. В результате при необходимости эти значения могут оставаться закрытыми значениями класса Box.

В приведенном примере метод super() был вызван с тремя аргументами.

Поскольку конструкторы могут быть перегруженными, метод super() можно вызывать, используя любую форму, определенную суперклассом.

Программа выполнит тот конструктор, который соответствует указанным аргументам.

В качестве примера приведем полную реализацию класса BoxWeight, которая предоставляет конструкторы для различных способов создания параллелепипедов.

В каждом случае метод super() вызывается с соответствующими аргументами.

Обратите внимание на то, что внутри класса Box его члены width, height и depth объявлены как закрытые.

// Полная реализация класса BoxWeight. class Box { private double width; private double height; private double depth; // конструирование клона объекта Box(Box ob) { // передача объекта конструктору width = ob.width; height = ob.height; depth = ob.depth; } // конструктор, используемый при указании всех измерений Box(double w, double h, double d) { width = w; height = h; depth = d; } // конструктор, используемый, если ни одно из измерений не указано Box() { width = -1; // значение -1 используется для указания height = -1; // неинициализированного depth = -1; // параллелепипеда } // конструктор, используемый при создании куба Box(double len) { width = height = depth = len; } // вычисление и возврат объема double volume() { return width * height * depth; } // Теперь BoxWeight полностью реализует все конструкторы } class BoxWeight extends Box { double weight; // вес параллелепипеда // конструирование клона объекта BoxWeight(BoxWeight ob) { // передача объекта конструктору super(ob); weight = ob.weight; } // конструктор, используемый при указании всех параметров BoxWeight(double w, double h, double d, double m) { super(w, h, d); // вызов конструктора суперкласса weight = m; } // конструктор, используемый по умолчанию BoxWeight() { super(); weight = -1; } // конструктор, используемый при создании куба BoxWeight(double len, double m) { super(len); weight = m; } } class DemoSuper { public static void main(String args[]) { BoxWeight myboxl = new BoxWeight(10, 20, 15, 34.3); BoxWeight mybox2 = new BoxWeight(2, 3, 4, 0.076); BoxWeight mybox3 = new BoxWeight(); //по умолчанию BoxWeight mycube = new BoxWeight(3, 2); BoxWeight myclone = new BoxWeight(myboxl); double vol; vol = myboxl.volume(); System.out.println("Объем myboxl равен " + vol); System.out.println("Beс myboxl равен " + myboxl.weight); System.out.println(); vol = mybox2.volume(); System.out.println("Объем mybox2 равен " + vol); System.out.println("Beс of mybox2 равен " + mybox2.weight) System.out.println(); vol = mуbохЗ.volume(); System.out.println ("Объем mуbохЗ равен " + vol); System.out.println("Вес mуbохЗ равен " + mуbохЗ.weight); System.out.println(); vol = myclone.volume(); System.out.println("Объем myclone равен " + vol); System.out.println ("Bec myclone равен " + myclone .weight) ; System.out.println(); vol = mycube.volume(); System.out.println("Объем mycube равен " + vol); System.out.println("Bec mycube равен " + mycube.weight); System.out.println(); } }

Эта программа создает следующий вывод:

Объем myboxl равен 3000.0

Вес myboxl равен 34.3

Объем mybox2 равен 24.0

Вес mybox2 равен 0.07 6

Объем mybохЗ равен -1.0

Вес mybохЗ равен -1.0

Объем myclone равен 3000.0

Вес myclone равен 34.3

Объем mycube равен 27.0

Вес mycube равен 2.0

Обратите особое внимание на следующий конструктор в классе BoxWeight.

// конструирование клона объекта BoxWeight(BoxWeight ob) { // передача объекта конструктору super(ob); weight = ob.weight; }

Обратите внимание на то, что метод super() выполняет передачу объекту

класса BoxWeight, а не класса Box. Тем не менее это все равно ведет к вызову конструктора Box(Box. ob).

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

Таким образом, объект класса BoxWeight можно передать конструктору Box().

Конечно, классу Box будут известны только его собственные члены.

Рассмотрим основные концепции применения метода super().

Когда подкласс вызывает метод super(), он вызывает конструктор своего непосредственного суперкласса. Таким образом, метод super() всегда ссылается на суперкласс, расположенный в иерархии непосредственно над вызывающим классом. Это справедливо даже в случае многоуровневой иерархии. Кроме того, метод super() всегда должен быть первым оператором, выполняемым внутри конструктора подкласса.

Второе применение ключевого слова super.

Вторая форма ключевого слова super действует подобно ключевому слову

this, за исключением того, что всегда ссылается на суперкласс подкласса, в котором она использована. Общая форма этого применения ключевого слова super имеет следующий вид:

super.член

Здесь член может быть методом либо переменной экземпляра.

Вторая форма применения ключевого слова super наиболее подходит в тех

ситуациях, когда имена членов подкласса скрывают члены суперкласса с такими же именами. Рассмотрим следующую простую иерархию классов.

// Использование ключевого слова super для предотвращения сокрытия имени, class А { int i; } // Создание подкласса за счет расширения класса А. class В extends А { int i; // эта переменная i скрывает переменную i в классе А В(int a, int b) { super.i = а; // i в классе А i = b; // i в классе В } void show() { System.out.println("i в суперклассе: " + super.i); System.out.println("i в подклассе: " + i); } } class UseSuper { public static void main(String args[]) { В subOb = new В(1, 2); subOb.show(); } }

Эта программа отображает следующее:

i в суперклассе: 1

i в подклассе: 2

Хотя переменная экземпляра i в классе В скрывает переменную i в классе А, ключевое слово super позволяет получить доступ к переменной i, определенной в суперклассе. Как вы увидите, ключевое слово super можно использовать также для вызова методов, которые скрываются подклассом.



Новости
    Без плагина
    На сайте WordPress имеется файл, именуемый как .htaccess. Многие пользователи не предают ему особого внимания и не используют все его возможности. На самом деле файл .htaccess – это дополнительные конфигурации

    Плагин подписки wordpress
    Очень трудно найти один плагин подписки wordpress , который объединил бы в себе все виды подписок, которые так необходимы сайту. Именно поэтому я решил сделать подборку лучших плагинов, которые смогут

    Слайд-шоу с помощью плагина для WordPress UnPointZero Slider
    Плагин для cms WordPress UnPointZero Slider – новостной слайдер. Он отражает в форме слайд-шоу изображения со ссылками на ваши статьи и краткие выдержки оттуда. Его можно установить и на новостной сайт,

    Плагины для Wordpress
    С помощью этого плагина вы легко сможете интегрировать Google диск на ваш WordPress сайт или блог . Gravity Forms — лучший плагин для создания форм на WordPress, от самых простых (например, форма

    Подписки плагином JetPack: размещение и редакция формы подписки
    Вступление Здравствуйте! В этой статье я покажу, как использовать плагин JetPack для создания пользовательской формы подписки и как эту формы подписки плагином JetPack добавлять в статьи сайта, а при

    Чистка сайта WordPress плагином WP-optimize
    От автора Со временем использования система WordPress накапливает не нужные файлы, комментарии и неиспользуемые данные в базе данных. Эти файлы и данные создаются в процессе работы и нужны для этого,

    Возможности Jetpack плагина
    Вступление Возможности Jetpack плагина это более 30 функциональных модуля плагина, делающего его универсальным плагином WordPress, заменяющего аналогичные сторонние плагины. Jetpack один заменяет десятки

    Резервное копирование WordPress сайта без плагинов
    Вступление Резервное копирование WordPress это второе, что нужно научиться делать после установки WordPress. Можно сколько угодно говорить о безопасности сайта и его защите, но лучшего варианта защиты

    Плагины на приват для Майнкрафт ПЕ
    > > Плагины на приват для Майнкрафт ПЕ Порой всем нам хочется попробовать себя в роли администратора сервера и испытать эту ответственность, но, к сожалению, вы не всегда все знаете о создании

    Плагин WordPress Database Backup. Архивация базы данных блога на WordPress
    Привет друзья! Сегодня на очереди еще один простой, НО, необходимый и полезный плагин — плагин WordPress Database Backup , который с легкостью и самостоятельно произведет процесс, который научно называется:

  • Виртуальный хостинг

    Виртуальный хостинг. Возможности сервера распределяются в равной мере между всеми... 
    Читать полностью

  • Редизайн сайта

    Редизайн сайта – это полное либо частичное обновление дизайна существующего сайта.... 
    Читать полностью

  • Консалтинг, услуги контент-менеджера

    Сопровождение любых интернет ресурсов;- Знание HTML и CSS- Поиск и обновление контента;-... 
    Читать полностью

  • Трафик из соцсетей

    Сравнительно дешевый способ по сравнению с поисковым и контекстным видами раскрутки... 
    Читать полностью

  • Поисковая оптимизация

    Поисковая оптимизация (англ. search engine optimization, SEO) — поднятие позиций сайта в результатах... 
    Читать полностью

rss