Спирала, Наследяване в Java

Наследяване в Java

Наследяването е процесът, чрез който един обект може да придобие свойствата на друг. По-точно, един обект може да наследи основните свойства на друг обект и да добави характеристики към тях, които са уникални за него. Наследяването ви позволява да поддържате концепцията за йерархията на класовете. Използването на класова йерархия прави големи потоци от информация управляеми.

Без използването на йерархия от класове, за всеки обект би било необходимо да се зададат всички характеристики, които напълно да го дефинират. Въпреки това, когато се използва наследяване, човек може да опише обект, като дефинира общия клас (или класове), към който принадлежи, с онези специални характеристики, които правят обекта уникален.

Модификатори на достъпМодификаторите на достъп могат да се разглеждат както от гледна точка на капсулиране, така и на наследяване. Ако се разглежда от позицията на наследяване, тогава модификаторите за достъп позволяват чрез задаване на достъп да се уточнят членовете на класа, които ще бъдат автоматично наследени от класа наследник и кои не. Например, променлива или метод, декларирани като публични в даден клас, автоматично ще бъдат приети в клас наследник.

Само от този клас

От дадения клас и неговите потомци

За всички класове в този пакет

Адаптерни класове и вътрешни класове като алтернатива на множественото наследяване.

Повечето интерфейси имат повече от един метод. Дори ако трябва да се използва само един метод, той пак трябва да дефинира (празни) всички останали. Това претрупва програмата и я прави трудна за четене. Адаптери и вътрешни класове се използват за съкращаване на кода. Класовете на адаптера са удобни за интерфейси, които имат повече от един метод, тъй като дефиницията на всички функцииза интерфейси не се отнася за класове.

Както знаете, Java не позволява множествено наследяване от класове, за разлика от интерфейсите. Какво ще стане, ако потребителят иска да наследи класа на адаптера и някой друг клас едновременно, например Applet? Решението на този проблем е да се използва вътрешен клас, който разширява адаптера. По-долу е кодовият фрагмент с вътрешния клас:

публичен клас MyClass разширява Applet

addMouseListener(нов MyAdapter());

// Адаптер за разширяване на вътрешен клас. клас MyAdapter разширява MouseAdapter

public vo >mouseClicked ( MouseEvent e)

Можете допълнително да съкратите кода, като използвате дефиниция на анонимен (ненаименуван) вътрешен клас, както следва.

public >MyClass разширява аплета

. // Конструктор MyClass ( ) addMouseListener (нов MouseAdapter ()

public vo >mouseClicked ( MouseEvent e)

Наследяване чрез низходящо и възходящо кастинг

Наследяването на класа осигурява възможност за преобразуване на тип между суперклас и подклас. Има два вида преобразуване на типове - възходящо и понижаващо. Upcasting е преобразуване от типа на производен клас (от подклас) към база (суперклас). Такава трансформация винаги е разрешена. За него няма ограничения и не са необходими допълнителни синтактични конструкции за изпълнението му. Това се дължи на факта, че обектът на подкласа винаги съдържа обекта на суперкласа като своя част.

Downcasting е преобразуване от суперклас в подклас. Тази трансформация има редица ограничения. Първо, може да се посочи изрично само чрезоперации за преобразуване на типа, например

Второ, преобразуването трябва да използва подходящия тип. Ако не е, тогава ClassCastException се хвърля по време на изпълнение на програмата.

Преобразуването надолу често използва операциятаinstanceof. Тази операция проверява дали неговият ляв операнд има класа, определен от десния операнд. Например,

if ( екземпляр на B ) b1 = (B)a;

Пример, комбиниращ преобразувания на типове и instanceof :

Разгледайте йерархията на класовете Issue - печатно издание, Book - книга, Newspaper - вестник, Journal - списание, където Book , Newspaper и Journal са наследници на класа Issue .