Наследование в Java — механизм, который позволяет одному классу получить все элементы и свойства другого класса. Этот процесс также называют расширением, преобразованием или отношением «родитель-потомок».
Основные обозначения:
Суперкласс (родитель) — основной класс, от которого принимаются все элементы.
Подкласс (расширенный, дочерний) — класс, который преобразовывается от другого класса, при этом может иметь свои элементы.
Зачем применяют наследование в Java? Суть в том, что можно образовать новые классы, используя уже имеющийся код. При этом есть возможность добавить другие переменные в дочерний класс, получив при этом новый.
Синтаксис:
class Имя-подкласса extends Имя-суперкласса { // свойства и элементы }
Ключевое слово extends означает, что создается новый класс от уже имеющегося.
class Fruit { // поля и элементы } // применяем расширение class Apple extends Fruit { // свойства и элементы Fruit // свойства и элементы Apple }
Из примера видно, что класс Apple создается из Fruit, при этом наследуются все его элементы. Так, Fruit — это класс-родитель, а Apple — класс-потомок.
Основной и дочерний класcы создают определенную иерархию. На вершине — всегда базовый, а под ним строятся подклассы. При этом преобразованный класс служит родителем для других подклассов.
В Java существуют такие способы преобразования:
Рассмотрим их по порядку.
Механизм одиночного наследования очень прост: подкласс получает свойства только от одного основного класса:
class Pet{ public void walk (){System.out.println("I will walk");} class Cow extends Pet{ public void moo (){System.out.println("I will moo");} }
Результат:
I will walk I will moo
Многоуровневый процесс происходит при наследовании дополнительного класса от базового, затем этот же класс действует уже как основной для следующего:
class Pet{ public void walk (){System.out.println("I will walk.");} } class Cat extends Pet{ public void sleep (){System.out.println("I will sleep ");} } class Kitty extends Cat{ public void purr (){System.out.println("I will purr");} } class TestIn { public static void main(String args[]){ Kitty c=new Kitty(); c.walk (); c.sleep(); c.purr(); }}
Результат:
I will walk I will sleep I will purr
То есть, в конце мы обращаемся к методу walk() от Pet, потом к sleep() от Cat, а затем к purr () от Kitty.
Иерархическое наследование происходит, когда несколько подклассов получают разрешение от одного суперкласса:
class Pet{ public void walk(){ System.out.println ("I will walk");} } class Cat extends Pet{ public void sleep (){ System.out.println("I will sleep");} } class Kitty extends Pet{ public void purr(){ System.out.println("I will purr");} } class TestIn { public static void main(String args[]){ Kitty c=new Kitty(); c.purr(); c.walk(); //c.sleep -Error }}
Результат:
I will purr I will walk
Класс Kitty унаследовал от Pet walk(), а также у него есть свой purr (), соответственно метод sleep() от Cat ему не доступен.
Написание кода подчиняется своим законам. В Java также есть определенные правила.
Чтобы обратиться к методу родителя, нужно использовать ключевое слово super.
Давайте используем один из предыдущих вариантов-примеров, добавив super в преобразованный Cow:
class Cow extends Pet{ // обращаемся к walk в Pet super. walk (); System.out.println("I will produce milk");} public void moo (){ System.out.println ("I will moo");} } class TestIn{ public static void main (String args[]){ Cow small=new Cow(); small.walk (); small. moo (); }}
Результат:
I will walk I will produce milk I will moo
В главном Pet есть walk (), также и в расширенном Сow, но уже с приставкой super.walk (), мы обращаемся к walk () в суперкласс из подкласса.
Если protected (защищен) стоит перед элементами и методами — это указание на то, что к ним можно обратиться из производного класса:
class Pet { protected String name; protected void display () System.out.println (“I am a pretty pet”); } class Kitty extends Pet{ public void getInfo (){ System.out.println (" Call me .." + name);} } class TestIn{ public static void main (String args[]){ Kitty small=new Kitty(); // обращаемся к защищенному display small.name = “Lilu”; small.display (); small.getInfo(); }}
Результат:
I am a pretty pet Call me Lilu
Как видно из примера, у нас есть основной класс — Pet — с защищенными name и display. Чтобы обойти эту защиту, мы создали новый объект small подкласса Kitty и получили необходимый доступ.
Интересно, что в Java нет многократного наследования — оно возможно только от одного суперкласса.
ОШИБКА:
public class extends Pet, Сow, Cat {}
Важно! В Java класс не может унаследовать ничего сам от себя.
В Java модификатор private сообщает о том, что классы-наследники не получат от родителя элементы с таким обозначением. Если вы попробуете произвести extends, компилятор выдаст ошибку.
Override (переопределение) — мощный инструмент, который применяется, когда необходимо изменить или переопределить реализацию метода, полученного от суперкласса.
class Cow extends Pet{ @Override public void walk (){ System.out.println ("I will run");}
Важные моменты при использовании Override:
Запретить создание подкласса можно просто применив final. Если класс отмечен как final, то ни один другой класс не может унаследовать от него элементы .
final class Pet { } class Kitty extends Pet { }
В результате мы получим ошибку.
Pet обозначен как final, поэтому Kitty не может получить от него ни поля ни переменных .
Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…
Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…
Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…
В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…
Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…
Дедлайн (от англ. deadline — «крайний срок») — это конечная дата стачи проекта или задачи…