HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p><strong>Внимание оговорки:</strong></p>
1 <p><strong>Внимание оговорки:</strong></p>
2 <ul><li>16 Доступен метод предка, а не потомка.</li>
2 <ul><li>16 Доступен метод предка, а не потомка.</li>
3 <li>22 вместо слова "метод" подразумевается слово "класс".</li>
3 <li>22 вместо слова "метод" подразумевается слово "класс".</li>
4 </ul><blockquote><p>В этом уроке Вы добавляете наследование в java в копилку своих знаний.</p>
4 </ul><blockquote><p>В этом уроке Вы добавляете наследование в java в копилку своих знаний.</p>
5 <p>Код, примеры из которого приведены здесь, можно взять<a>вот в этом репозитории</a>.</p>
5 <p>Код, примеры из которого приведены здесь, можно взять<a>вот в этом репозитории</a>.</p>
6 </blockquote><p><strong>Наследование</strong>- это механизм, который позволяет создавать классы на основе других классов. Это дает возможность расширять свойства наследуемого класса, и сохранять работоспособность ранее написанного кода.</p>
6 </blockquote><p><strong>Наследование</strong>- это механизм, который позволяет создавать классы на основе других классов. Это дает возможность расширять свойства наследуемого класса, и сохранять работоспособность ранее написанного кода.</p>
7 <ul><li>Все классы в мире java, косвенно или прямо, являются наследниками класса Object.</li>
7 <ul><li>Все классы в мире java, косвенно или прямо, являются наследниками класса Object.</li>
8 <li>Наследоваться можно только от одного класса.</li>
8 <li>Наследоваться можно только от одного класса.</li>
9 </ul><p>Для того чтобы некий класс стал наследником другого класса, в его объявлении применяется ключевое слово extends и имя наследуемого класса. Вот как это выглядит в коде:</p>
9 </ul><p>Для того чтобы некий класс стал наследником другого класса, в его объявлении применяется ключевое слово extends и имя наследуемого класса. Вот как это выглядит в коде:</p>
10 <p>Но мы не можем написать так: class Primate extends Animal, SomeClass, Foo {.<em>Наследоваться можно только от одного класса.</em></p>
10 <p>Но мы не можем написать так: class Primate extends Animal, SomeClass, Foo {.<em>Наследоваться можно только от одного класса.</em></p>
11 <p><strong>Член класса</strong>- это либо метод, либо поле класса.</p>
11 <p><strong>Член класса</strong>- это либо метод, либо поле класса.</p>
12 <h2>Для чего нужно это наследование?</h2>
12 <h2>Для чего нужно это наследование?</h2>
13 <p>Наследование, как было сказано в видео, необходимо для того, чтобы не дублировать ранее написанный код, а использовать его же, но с новыми возможностями.</p>
13 <p>Наследование, как было сказано в видео, необходимо для того, чтобы не дублировать ранее написанный код, а использовать его же, но с новыми возможностями.</p>
14 <p>Для разнообразия приведу пример не на ветвлении класса Game, а на упрощенной классификации животных.</p>
14 <p>Для разнообразия приведу пример не на ветвлении класса Game, а на упрощенной классификации животных.</p>
15 <p>Начнем с класса Animal:</p>
15 <p>Начнем с класса Animal:</p>
16 <p>Не зависимо от типа, животное может быть живым или мертвым и иметь некий возраст. Пока этих полей хватит.</p>
16 <p>Не зависимо от типа, животное может быть живым или мертвым и иметь некий возраст. Пока этих полей хватит.</p>
17 <p>Далее создадим класс приматов:</p>
17 <p>Далее создадим класс приматов:</p>
18 <p>Класс приматов будет немного сложнее. Но любой примат точно может быть живым или мертвым и иметь некий возраст. Поэтому он является наследником класса Animal.</p>
18 <p>Класс приматов будет немного сложнее. Но любой примат точно может быть живым или мертвым и иметь некий возраст. Поэтому он является наследником класса Animal.</p>
19 <p>Далее создадим класс обезьян:</p>
19 <p>Далее создадим класс обезьян:</p>
20 <p>Будем классифицировать обезьян по диете и на этом успокоимся. Но каждая обезьяна точно должна включать в себя все параметры примата. Поэтому класс Monkey наследуется от класса Primate.<strong>Получается, что в классе Monkey мы уже не дублируем шесть полей и кучу методов к ним, а переиспользуем уже написанное!</strong></p>
20 <p>Будем классифицировать обезьян по диете и на этом успокоимся. Но каждая обезьяна точно должна включать в себя все параметры примата. Поэтому класс Monkey наследуется от класса Primate.<strong>Получается, что в классе Monkey мы уже не дублируем шесть полей и кучу методов к ним, а переиспользуем уже написанное!</strong></p>
21 <p>В упомянутом выше репозитории Вы еще найдете класс HomoSapiens как пример ветвления наследников.</p>
21 <p>В упомянутом выше репозитории Вы еще найдете класс HomoSapiens как пример ветвления наследников.</p>
22 <h2>Как использовать наследование?</h2>
22 <h2>Как использовать наследование?</h2>
23 <p>Сразу же начнем с примера использования объекта класса Monkey. Вертеть ее будем в классе CrittersUsage.</p>
23 <p>Сразу же начнем с примера использования объекта класса Monkey. Вертеть ее будем в классе CrittersUsage.</p>
24 <p>Как видно из кода - объекту класса Monkey доступны все члены всех классов-предков. Даже Object.toString(). Реализован Object.toString() слишком обобщенно, поэтому данный метод просто возвращает системное имя объекта, у которого он был вызван. В моем случае это было com.critters.Monkey@1b6d3586.</p>
24 <p>Как видно из кода - объекту класса Monkey доступны все члены всех классов-предков. Даже Object.toString(). Реализован Object.toString() слишком обобщенно, поэтому данный метод просто возвращает системное имя объекта, у которого он был вызван. В моем случае это было com.critters.Monkey@1b6d3586.</p>
25 <h2>Доступность членов классов-предков в классах-наследниках</h2>
25 <h2>Доступность членов классов-предков в классах-наследниках</h2>
26 <p>Обратите внимание на то, что ссылки в аргументах методов printAnimalAge &amp; printAnimalAliveStatus имеют тип Animal. Это хоть и позволяет этим методам принимать на вход объекты-наследники от класса Animal, но это же ограничивает доступность членов объекта для данных методов. Тип ссылки ограничивает видимость членов объекта по себе. То есть, несмотря на то, что мы знаем, что в ссылках someAnimal на самом деле представлен объект класса Monkey, но мы сможем использовать только члены класса (типа) Animal: isAlive(), setAlive(...), getAge(), setAge(...), в выше упомянутых методах. А поля класса Animal видны только в рамках пакета critters, потому что они не имеют модификатора доступа.</p>
26 <p>Обратите внимание на то, что ссылки в аргументах методов printAnimalAge &amp; printAnimalAliveStatus имеют тип Animal. Это хоть и позволяет этим методам принимать на вход объекты-наследники от класса Animal, но это же ограничивает доступность членов объекта для данных методов. Тип ссылки ограничивает видимость членов объекта по себе. То есть, несмотря на то, что мы знаем, что в ссылках someAnimal на самом деле представлен объект класса Monkey, но мы сможем использовать только члены класса (типа) Animal: isAlive(), setAlive(...), getAge(), setAge(...), в выше упомянутых методах. А поля класса Animal видны только в рамках пакета critters, потому что они не имеют модификатора доступа.</p>
27 <blockquote><p>Это означает, что видимость членов классов в наследовании работает только на верх. Наследники наследуют все свойства предков, а предкам недоступны свойства наследников.</p>
27 <blockquote><p>Это означает, что видимость членов классов в наследовании работает только на верх. Наследники наследуют все свойства предков, а предкам недоступны свойства наследников.</p>
28 </blockquote><p><strong>super</strong>- ключевое слово, позволяющее наследнику получить доступ к членам класса-предка, которые перекрыты такими же членами класса-наследника. Но наследник:</p>
28 </blockquote><p><strong>super</strong>- ключевое слово, позволяющее наследнику получить доступ к членам класса-предка, которые перекрыты такими же членами класса-наследника. Но наследник:</p>
29 <ul><li>не имеет доступа к private членам класса-предка;</li>
29 <ul><li>не имеет доступа к private членам класса-предка;</li>
30 <li>может иметь доступ к членам, которые без модификатора доступа, если лежит с предком в одном пакете;</li>
30 <li>может иметь доступ к членам, которые без модификатора доступа, если лежит с предком в одном пакете;</li>
31 <li>может иметь доступ к членам класса-предка, которые с модификатором protected, не зависимо от расположения в пакетах.</li>
31 <li>может иметь доступ к членам класса-предка, которые с модификатором protected, не зависимо от расположения в пакетах.</li>
32 </ul><p>Естественно, что public члены любого класса светятся во весь мир.</p>
32 </ul><p>Естественно, что public члены любого класса светятся во весь мир.</p>
33 <p>Рассмотрим на примерах.</p>
33 <p>Рассмотрим на примерах.</p>
34 <p>Для начала, добавим:</p>
34 <p>Для начала, добавим:</p>
35 <ul><li>в класс Animal строку protected final String hiddenMember = "Animal's hidden string.";.</li>
35 <ul><li>в класс Animal строку protected final String hiddenMember = "Animal's hidden string.";.</li>
36 <li>в класс Primate строки protected final String hiddenMember = "Primate's hidden first string."; и private final String secondHiddenMember = "Primate's hidden second string.";.</li>
36 <li>в класс Primate строки protected final String hiddenMember = "Primate's hidden first string."; и private final String secondHiddenMember = "Primate's hidden second string.";.</li>
37 <li>в класс Monkey строку protected final String hiddenMember = "Monkeys's hidden string.";. И Добавим еще сюда метод accessToHiddenMembers().</li>
37 <li>в класс Monkey строку protected final String hiddenMember = "Monkeys's hidden string.";. И Добавим еще сюда метод accessToHiddenMembers().</li>
38 </ul><p>Теперь класс Monkey будет выглядеть так:</p>
38 </ul><p>Теперь класс Monkey будет выглядеть так:</p>
39 <p>Обратите внимание, что при помощи слова super мы получили доступ к полю hiddenMember класса Primate. Хотя мы его перекрыли таким же полем в классе Monkey.</p>
39 <p>Обратите внимание, что при помощи слова super мы получили доступ к полю hiddenMember класса Primate. Хотя мы его перекрыли таким же полем в классе Monkey.</p>
40 <p>Но мы не можем получить доступ к скрытому члену класса-предка-предка Animal. Хотя можем пройтись по всем другим членам классов-предков вплоть до Object. Перекрывая член класса-предка - теряем доступ к этому члену во всех классах-предках, кроме ближайшего.</p>
40 <p>Но мы не можем получить доступ к скрытому члену класса-предка-предка Animal. Хотя можем пройтись по всем другим членам классов-предков вплоть до Object. Перекрывая член класса-предка - теряем доступ к этому члену во всех классах-предках, кроме ближайшего.</p>
41 <h2>Полезные ссылки</h2>
41 <h2>Полезные ссылки</h2>
42 <ul><li><p><a>Про наследование от Oracle</a></p>
42 <ul><li><p><a>Про наследование от Oracle</a></p>
43 </li>
43 </li>
44 <li><p><a>еще вариант объяснение темы про наследование (RU)</a></p>
44 <li><p><a>еще вариант объяснение темы про наследование (RU)</a></p>
45 </li>
45 </li>
46 <li><p><a>Еще один хороший источник с табличками (EN)</a></p>
46 <li><p><a>Еще один хороший источник с табличками (EN)</a></p>
47 </li>
47 </li>
48 <li><p><a>Документация по ключевому слову super</a></p>
48 <li><p><a>Документация по ключевому слову super</a></p>
49 </li>
49 </li>
50 </ul>
50 </ul>