Скачать презентацию Наследование Лекция 3 УНЦ Инфотех Воронеж 2012 Скачать презентацию Наследование Лекция 3 УНЦ Инфотех Воронеж 2012

Тема3_1_Наследование_Классов.ppt

  • Количество слайдов: 47

Наследование Лекция 3 УНЦ «Инфотех» Воронеж 2012 Наследование Лекция 3 УНЦ «Инфотех» Воронеж 2012

План лекции Наследование классов и создание объектов дочерних классов n Переопределение методов n Сокрытие План лекции Наследование классов и создание объектов дочерних классов n Переопределение методов n Сокрытие полей n Завершенные и абстрактные методы и классы n Описание и применение интерфейсов n 1

НАСЛЕДОВАНИЕ n Наследование – связь между двумя классами, при которой объект одного класса (потомок, НАСЛЕДОВАНИЕ n Наследование – связь между двумя классами, при которой объект одного класса (потомок, подкласс) может рассматриваться как объект другого класса (родитель, базовый класс) n В частности объект класса-потомка наследует полями и методами родительского класса n Выражение, имеющее тип класса-потомка можно присвоить переменной, имеющей тип родителя

Наследование в Java Виды наследования n Класс l Расширяет класс l Реализует интерфейсы n Наследование в Java Виды наследования n Класс l Расширяет класс l Реализует интерфейсы n Интерфейс l Расширяет интерфейсы 3

Расширение классов Класс может расширить только один класс n Расширяющий класс называется производным (дочерним, Расширение классов Класс может расширить только один класс n Расширяющий класс называется производным (дочерним, подклассом) n Расширяемый класс называется базовым (родительским, суперклассом) n class My. Class 1 { } class My. Class 2 extends My. Class 1 { } My. Class 1 - суперкласс 4

Расширение классов class А { int i; // public по умолчанию int j; // Расширение классов class А { int i; // public по умолчанию int j; // private для A void setij(int x, int y) { i = x; j = y; } } class В extends А { int k; void showk() { System. out. print. In(“k: " + k); } void sum() { System. out. println("i+j+k: " + (i+j+k)); } } 5

Расширение классов class Simplelnheritance { public static void main(String args[]) { A super. Ob Расширение классов class Simplelnheritance { public static void main(String args[]) { A super. Ob = new A(); В sub. Ob = new В(); // Суперкласс может быть использован сам по себе super. Ob. i = 10; super. Ob. j = 20; System. out. println("Содержимое super. Ob: "); super. Ob. showij(); System. out. println(); /* Подкласс имеет доступ ко всем public-членам его суперкласса. */ sub. Ob. i = 7; sub. Ob. j=8; sub. Ob. k = 9; System. out. println("Содержимое of sub. Ob: "); sub. Ob. showij(); sub. Ob. showk(); System. out. println("Сумма i, j и k в sub. Ob: "); sub. Ob. sum(); } } 6

Доступ к элементам n Управление доступом l public - доступный отовсюду. l private - Доступ к элементам n Управление доступом l public - доступный отовсюду. l private - не видимый извне своего класса (суперкласса). l protected - видимый только в классах, являющихся прямыми подклассами класса 7

Доступ к элементам class А { int i; // public по умолчанию private int Доступ к элементам class А { int i; // public по умолчанию private int j; // private для A void setij(int x, int y) { i = x; j = y; } } // j класса А здесь не доступна (подклассам private-члены не доступны) class В extends А { int total; void sum () { total = i + j; // ОШИБКА, j здесь не доступна } } class Access { public static void main (String args[]) { В sub. Ob = new В () ; sub. Ob. setij(10, 12); sub. Ob. sum(); System. out. println("Всего " + sub. Ob. total); } } 8

Конструкторы дочерних классов n Вызываются при создании объектов дочерних классов n Могут вызывать друга Конструкторы дочерних классов n Вызываются при создании объектов дочерних классов n Могут вызывать друга по ключевому слову this() n Могут вызывать конструкторы базового класса по ключевому слову super() Вызов super(), если он присутствует должен быть первой командой тела конструктора Ключевое слово super() может не использоваться, только если в родительском классе существует конструктор по умолчанию Модификатор protected используется для описания элементов класса, которые доступны в пакете и в классах-потомках n n n 9

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

Порядок создания объекта n Порядок вызова конструкторов: Вызов конструктора базового класса l Присваивание исходных Порядок создания объекта n Порядок вызова конструкторов: Вызов конструктора базового класса l Присваивание исходных значений полям объекта посредством выполнения соответствующих выражений и блоков инициализации l Выполнение инструкций в теле конструктора (конструкторов) l n Состояние объекта инициализируется «послойно» от Object до конкретного класса 11

пример class Super. Show { public String str = пример class Super. Show { public String str = "Super. Str"; public void show() { System. out. println("Super. show: " + str); } } class Extend. Show extends Super. Show { public String str = "Extend. Str"; public void show() { System. out. println("Extend. show: " + str); } } 12

и его результат public static void main(String[] args) { Extend. Show ext = new и его результат public static void main(String[] args) { Extend. Show ext = new Extend. Show(); Super. Show sup = ext; ext. show(); sup. show(); System. out. println("ext. str = " + ext. str); System. out. println("sup. str = " + sup. str); } Extend. show: Extend. Str ext. str = Extend. Str sup. str = Super. Str 13

Служебное слово super Действует как ссылка на текущий экземпляр по контракту базового класса n Служебное слово super Действует как ссылка на текущий экземпляр по контракту базового класса n Может быть использовано в теле любого нестатического члена класса n Формы использования n l super(. . . ) l super. method(. . . ) l super. field 14

Совпадение имен методов в родительском и дочернем классах n Сигнатуры различны Перегрузка – добавляется Совпадение имен методов в родительском и дочернем классах n Сигнатуры различны Перегрузка – добавляется метод с другими параметрами n Сигнатуры совпадают Переопределение – замещение версии метода, объявленной в базовом классе, новой, с точно такой же сигнатурой 15

ПЕРЕКРЫТИЕ МЕТОДОВ n По умолчанию методы класса являются виртуальными, т. е. класс-потомок может перекрыть ПЕРЕКРЫТИЕ МЕТОДОВ n По умолчанию методы класса являются виртуальными, т. е. класс-потомок может перекрыть любой доступный ему метод родительского класса n Для перекрытия достаточно описать в классе-потомке метод, заголовок которого совпадает с заголовком метода родителя n Перекрытый метод будет вызван, даже если синтаксически объект имеет тип родителя (полиморфизм)

ПЕРЕКРЫТИЕ МЕТОДОВ n Возможно обращение к унаследованной версии метода через фиктивный объект super n ПЕРЕКРЫТИЕ МЕТОДОВ n Возможно обращение к унаследованной версии метода через фиктивный объект super n Модификатор final явно запрещает перекрытие метода n Кроме того, private и static методы не являются виртуальными

ПЕРЕКРЫТИЕ МЕТОДОВ class Base { protected String name() { return ПЕРЕКРЫТИЕ МЕТОДОВ class Base { protected String name() { return "Base"; } } class More extends Base { protected String name() { return "More"; } protected void print. Name() { Base sref = (Base) this; System. out. println("this. name() = " + this. name()); System. out. println("sref. name() = " + sref. name()); System. out. println("super. name()="+ super. name()); } }

Перекрытие методов n При обращении извне объекта производного класса к его методу всегда вызывается Перекрытие методов n При обращении извне объекта производного класса к его методу всегда вызывается новая версия метода n Уровень доступа при переопределении не может сужаться 19

Перекрытие методов n В предложении throws дочернего метода не может быть типов исключений, не Перекрытие методов n В предложении throws дочернего метода не может быть типов исключений, не совместимых с типами в предложении throws родительского метода n Переопределенный метод может быть снабжен модификатором abstract n Признаки synchronized, native и strictfp могут изменяться произвольно 20

Сокрытие статических членов n Статические члены не могут быть переопределены, они скрываются n Обычно Сокрытие статических членов n Статические члены не могут быть переопределены, они скрываются n Обычно для доступа используется имя класса, поэтому проблем не возникает n Если используется ссылка, то учитывается объявленный тип ссылки, а не фактический тип объекта 21

Совпадение имен методов в родительском и дочернем классах n super действует также как ссылка Совпадение имен методов в родительском и дочернем классах n super действует также как ссылка this 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 Use. Super { public static void main(String args[]) { В sub. Ob = new В(1, 2); sub. Ob. show(); } } 22

Замечание Важно понимать, что: n Переопределение методов – фундаментальный механизм ООП, в частности, обеспечивающий Замечание Важно понимать, что: n Переопределение методов – фундаментальный механизм ООП, в частности, обеспечивающий полиморфизм n Сокрытие полей – последствие отсутствия ограничений на имена полей 23

Завершенные методы и классы n Завершенный метод не допускает переопределения final public int get. Завершенные методы и классы n Завершенный метод не допускает переопределения final public int get. Value(); n Завершенный класс не допускает расширения final class My. Class {. . . } 24

Абстрактные классы и методы n n Абстрактный класс – возможность определить суперкласс, который объявляет Абстрактные классы и методы n n Абстрактный класс – возможность определить суперкласс, который объявляет структуру некоторой абстракции без законченной реализации каждого метода Абстрактный класс – определяет только обобщенную форму, которая будет раздельно использоваться всеми его подклассами, предоставляя каждому подклассу возможность заполнить ее своими деталями 25

Абстрактные классы и методы n Абстрактный метод - возможность определять методы суперкласса, которые должны Абстрактные классы и методы n Абстрактный метод - возможность определять методы суперкласса, которые должны быть переопределены подклассом для того, чтобы приобрести для указанного подкласса определенное значение 26

Абстрактные классы и методы n Абстрактные методы описывают сигнатуру без реализации abstract public int Абстрактные классы и методы n Абстрактные методы описывают сигнатуру без реализации abstract public int get. Value(); n Класс с абстрактными методами обязан быть абстрактным abstract class My. Class {. . . } n Расширяющий класс может перекрыть своими абстрактными родительские реализованные методы n Абстрактный класс не обязан иметь абстрактные методы n Создавать объекты абстрактных типов нельзя! 27

Пример абстрактного класса //демонстрация абстракций abstract class А { abstract void callme(); //в абстрактных Пример абстрактного класса //демонстрация абстракций abstract class А { abstract void callme(); //в абстрактных классах допустимы обычные методы void callmetoo() { System. out. println("Это конкретный метод. "); } } class В extends А { void callme() { System. out. println("В — реализация callme. "); } } class Abstract. Demo { public static void main(String args. U) { В b = new В(); b. callmetoo(); } } 28

Контракт класса n n n Классы контрактов кода позволяют задавать в коде предварительные условия, Контракт класса n n n Классы контрактов кода позволяют задавать в коде предварительные условия, постусловия и инварианты объектов. Предварительные условия — это требования, которые должны выполняться при входе в метод или свойство. Постусловия описывают ожидания во время выхода из кода метода или свойства. Инварианты объектов описывают ожидаемое состояние класса, у которого нет проблем состояния. Контракты используются только между программными модулями. Нельзя использовать для проверки данных, вводимые пользователем на корректность 29

Пример контракта класса n com. google. java. contract. * — основное пространство имен библиотеки Пример контракта класса n com. google. java. contract. * — основное пространство имен библиотеки n @Contracted — подсказка для IDE, говорит о том, что класс использует контракты. n @Invariant — Инварианты определяют глобальные свойства некоторого класса, которые должны соблюдаться после его создания на протяжении всего времени жизни. @Requires — определяет предусловия – то, что должно быть истинно ДО входа в метод или функцию. @Ensures — определяет постусловия – то, что должно быть истинно ПОСЛЕ выхода из метода или функции. @Throw. Ensures — позволяет генерировать заданное исключение при выполнении проверки постусловий. @Ensures и @Requires у каждого метода может быть только по одной n n 30

Наследование Практическое воплощение наследования n Наследование контракта или типа, в результате чего производный класс Наследование Практическое воплощение наследования n Наследование контракта или типа, в результате чего производный класс получает тип базового, поэтому может быть использован полиморфным образом n Наследование способов реализации, в результате производный класс приобретает функциональные характеристики базового в виде набора доступных полей и методов 31

Понятие интерфейса n n n Интерфейсы разработаны для поддержки динамического вызова методов во время Понятие интерфейса n n n Интерфейсы разработаны для поддержки динамического вызова методов во время выполнения. используя interface, вы можете указать, что класс должен делать, но не как он это делает Интерфейсы синтаксически подобны классам, но в них нет экземплярных переменных, и их методы объявляются без тела. 32

Понятие интерфейса n Интерфейсы позволяют описать тип в полностью абстрактной форме n Экземпляры интерфейсов Понятие интерфейса n Интерфейсы позволяют описать тип в полностью абстрактной форме n Экземпляры интерфейсов создавать нельзя n Классы способны реализовывать один или несколько интерфейсов n Реализация классом интерфейса означает согласие класса на внешний контракт, описываемый реализуемым интерфейсом 33

Наследование в Java Виды наследования n Класс Наследование как внешнего контракта, так и реализации Наследование в Java Виды наследования n Класс Наследование как внешнего контракта, так и реализации l Расширяет класс l Реализует интерфейсы n Интерфейс Наследование ТОЛЬКО внешнего контракта l Расширяет интерфейсы 34

Объявление интерфейсов interface Somethingable { // константы // методы // вложенные классы и интерфейсы Объявление интерфейсов interface Somethingable { // константы // методы // вложенные классы и интерфейсы } n Все члены интерфейса по умолчанию обладают признаком public n Применение других модификаторов редко имеет смысл Возможны пустые интерфейсы n 35

Константы в интерфейсах n Если интерфейс не содержит методов, то класс, который включает такой Константы в интерфейсах n Если интерфейс не содержит методов, то класс, который включает такой интерфейс, по сути импортирует постоянные переменные в пространство имен класса как константы (final-переменные ). interface Verbose { int SILENT = 0; int TERSE = 1; int NORMAL = 2; int VERBOSE = 3; } Константы имеют неявные модификаторы public static final n n Должны быть снабжены инициализаторами 36

Методы в интерфейсах interface Verbose { void set. Verbosity(int level); int get. Verbosity(); } Методы в интерфейсах interface Verbose { void set. Verbosity(int level); int get. Verbosity(); } n Имеют неявные модификаторы public abstract n Не могут иметь модификаторов native synchronized strictfp static final 37

Реализация интерфейсов классами n n Оператор implements — это дополнение к определению класса, реализующего Реализация интерфейсов классами n n Оператор implements — это дополнение к определению класса, реализующего некоторый интерфейс(ы). Если в классе реализуется несколько интерфейсов, то их имена разделяются запятыми. class My. New. Thread extends My. Thread implements Runnable, Verbose {. . . } 38

Реализация интерфейсов классами Интерфейсы реализуются классами n Класс может реализовывать несколько интерфейсов n Если Реализация интерфейсов классами Интерфейсы реализуются классами n Класс может реализовывать несколько интерфейсов n Если класс не реализует все методы «наследуемых» интерфейсов, он является абстрактным n 39

Расширение интерфейсов интерфейсами interface New. Verbose extends Verbose, Runnable { //. . . } Расширение интерфейсов интерфейсами interface New. Verbose extends Verbose, Runnable { //. . . } n Допускается сокрытие констант n Переопределение метода не несет семантической нагрузки n Совпадение имен наследуемых методов не несет семантической нагрузки 40

Расширение интерфейсов интерфейсами // Один интерфейс расширяет другой, interface А { void methl(); void Расширение интерфейсов интерфейсами // Один интерфейс расширяет другой, interface А { void methl(); void meth 2 (); } //В теперь включает methi() и meth 2() , а сам он добавляет meth 3(). interface В extends А { void metn 3(); } // Этот класс должен реализовать все из А и В. class My. Class implements В { public void meth 1() { System. out. println("Реализует meth 1(). ; } public void meth 2() { System. out. println("Реализует meth 2(). "); } public void meth 3() { System. out. println("Реализует meth 3(). "); } } class IFExtend { public static void main(String arg[]) { My. Class ob = new My. Class () ; ob. meth 1(); ob. meth 2(); ob. meth 3(); } } 41

Интерфейс или абстрактный класс? n Интерфейсы обеспечивают инструментарий множественного наследования, производный класс способен наследовать Интерфейс или абстрактный класс? n Интерфейсы обеспечивают инструментарий множественного наследования, производный класс способен наследовать одновременно несколько интерфейсов n Класс может расширять единственный базовый класс, даже если тот содержит только абстрактные методы 42

Интерфейс или абстрактный класс? n Абстрактный класс частично может быть реализован, он вправе содержать Интерфейс или абстрактный класс? n Абстрактный класс частично может быть реализован, он вправе содержать члены, помеченные как protected и/или static и т. п. n Структура интерфейса ограничена объявлениями public-констант и publicметодов без какой бы то ни было реализации 43

Ссылки интерфейсных типов n Допускаются ссылки интерфейсных типов n Такая ссылка позволяет выполнять над Ссылки интерфейсных типов n Допускаются ссылки интерфейсных типов n Такая ссылка позволяет выполнять над объектом операции, описанные во внешнем контракте, обусловленном типом интерфейса n Такое средство существенно расширяет возможности полиморфизма 44

Пустые интерфейсы n Существуют пустые интерфейсы, объявления которых не содержат ни констант, ни методов Пустые интерфейсы n Существуют пустые интерфейсы, объявления которых не содержат ни констант, ни методов n Реализация таких интерфейсов обычно означает способность объекта к чему-либо n Ссылка такого типа редко имеет смысл (т. к. внешний контракт пуст) n Даже такая ссылка позволяет выполнять методы объекта… а именно методы, объявленные в классе Object, поскольку они есть у абсолютно любого объекта 45

Использование типов Ссылочные типы n Неявное приведение n Явное приведение n My. Thread Runnable Использование типов Ссылочные типы n Неявное приведение n Явное приведение n My. Thread Runnable My. New. Thread mnt = new My. New. Thread(); My. Thread mt = mnt; Runnable r 1 = mnt; Runnable r 2 = mt; // Ошибка!!! mnt = (My. New. Thread)mt; // Возможен выброс исключения mnt = (My. New. Thread)r 1; // Class. Cast. Exception 46