what is abstraction java learn with examples
Този урок обяснява какво е абстракция в Java заедно с примери за програмиране. Също така ще научите какво е абстрактен клас и защо се използва:
В тази серия JAVA ще обсъдим важните характеристики на обектно-ориентираното програмиране (OOP), които също са известни като четири стълба, т.е. абстракция, капсулиране, наследяване и полиморфизъм.
Първият стълб на ООП е „Абстракция“. „Абстракцията е процес на избор на данни, за да се покаже само съответната информация на потребителя.“
=> Погледнете тук ръководството за начинаещи Java.
Какво ще научите:
най-добрият софтуер за разработка на игри за начинаещи
Абстракция в ООП
С прости думи, абстракцията „показва“ само съответните атрибути на обектите и „скрива“ ненужните подробности.
Например, когато шофираме кола, ние сме загрижени само за това как караме / спираме колата, ускоряваме / прекъсваме и т.н. Ние просто не се интересуваме от тези подробности.
Това, от което се притесняваме, е „абстрактният“ изглед на тези операции, който ще ни помогне да задвижим колата напред и да стигнем до нашата дестинация. Това е прост пример за абстракция.
По този начин автомобилът има всички механизми и процеси на място, но от гледна точка на крайния потребител, т.е. перспектива на водача на автомобила, той / тя ще се интересува само от абстрактния поглед на тези процеси.
Абстракцията намалява усилията за програмиране и по този начин сложността. Крайният потребител, използващ приложението, не трябва да се притеснява от начина, по който се изпълнява определена функция. Той / тя може просто да използва функциите, както се изисква.
По този начин в абстракцията ние се занимаваме с идеи, а не със събитията. Това означава, че скриваме подробностите за изпълнението от потребителя и излагаме само функционалността на крайния потребител. По този начин потребителят ще знае само „какво прави“, а не „как го прави“.
Абстракцията в ООП може да бъде два вида.
# 1) Абстракция на данни
В абстракцията на данни ние най-вече създаваме сложни типове данни и скриваме тяхното изпълнение. Излагаме само операциите за манипулиране на тези типове данни, без да навлизаме в подробностите за тяхното изпълнение.
Едно от предимствата на този подход е, че можем да променим изпълнението по всяко време, без да променяме поведението, което е изложено на потребителя.
# 2) Контролна абстракция
Контролната абстракция събира всички контролни оператори, които са част от приложението, и ги излага като единица. Тази функция се използва, когато трябва да изпълним работеща функция, използвайки този контролен блок.
Контролната абстракция формира основната единица на структурираното програмиране и използвайки абстракция на контрола можем да дефинираме прости функции към сложни рамки.
Какво е абстракция в Java
Тъй като Java е OOP език, абстракцията може да се разглежда като една от важните характеристики и градивни елементи на езика Java. В Java абстракцията се реализира с помощта на абстрактен клас и интерфейс.
И така, как да приложим абстракция в Java? Java предоставя модификатор без достъп „абстрактно“ за внедряване на абстракция. Този абстрактен модификатор може да се използва с класове и методи, но не и с променливи.
Интерфейсът осигурява пълна абстракция, т.е. предоставя само прототипи на методи, а не тяхното изпълнение. Абстрактният клас осигурява частична абстракция, при която поне един метод не трябва да се прилага.
В този урок ще обсъдим подробно абстракцията с абстрактни класове. Ще проучим подробно интерфейсите в следващите ни уроци.
Пример за абстракция на Java
Нека разгледаме примера по-долу.
//abstract class abstract class Car{ abstract void accelerate(); } //concrete class class Suzuki extends Car{ void accelerate(){ System.out.println('Suzuki::accelerate'); } } class Main{ public static void main(String args()){ Car obj = new Suzuki(); //Car object =>contents of Suzuki obj.accelerate(); //call the method } }
Изход:
Простият пример за абстракция, който е даден по-горе, има клас Car. В този клас Car имаме абстрактен метод за ускоряване (). След това наследяваме този клас в класа Suzuki. В класа на Suzuki ние прилагаме метода за ускоряване.
Горният пример просто показва начина, по който абстрактният клас се дефинира, наследява и след това се използва в програмата.
Какво е абстрактен клас на Java
Вече споменахме, че Java реализира абстракция, използвайки абстрактни класове и интерфейси. Нека първо разгледаме всичко за абстрактния клас.
Абстрактният клас може да бъде дефиниран като клас, деклариран с ключовата дума „abstract“ и има ограничение, че не може да бъде създаден.
Абстрактният клас може или не може да има абстрактен метод (метод без реализация). Що се отнася до JVM, абстрактният клас е непълен клас, който няма пълно поведение.
Общият синтаксис на абстрактния клас е даден по-долу:
abstract class { public abstract void abstractMethod(); public void normalMethod() { //method body } }
Както е показано в синтаксиса на горния абстрактен клас, в абстрактния клас можем да имаме абстрактни, както и абстрактни методи. Ключовата дума ‘abstract’ предшества декларацията на класа.
Накратко, абстрактният клас може да бъде описан, както е показано по-долу.
Абстрактен метод в Java
Абстрактният метод е метод, предшестван от „абстрактна“ ключова дума без никакво изпълнение. Абстрактният метод е деклариран в абстрактния клас.
Абстрактният метод е този, който прави класа непълен, тъй като той няма реализация. Следователно, когато включим абстрактен метод в класа, естествено класът става непълен.
Можем да използваме абстрактния метод, като го реализираме в подклас, т.е.клас наследява абстрактния клас и след това реализира или предоставя кода за всички абстрактни методи, декларирани в абстрактния клас, като ги замени.
По този начин става задължително да се отмени абстрактния метод в подкласа. Ако абстрактният метод не е реализиран и в подкласа, тогава трябва да декларираме подкласа също като „абстрактен“.
Общата декларация на абстрактния метод е:
абстрактно нищожен methodName (списък_параметри);
Докато пишем абстрактния метод, трябва да помним следните правила:
- Клас, съдържащ един или повече абстрактни методи, е абстрактен клас.
- Някои други ключови думи не трябва да се използват с абстрактната ключова дума.
По този начин следните комбинации са незаконни в Java.
- финал
- абстрактен роден
- абстрактна статична
- абстрактно частно
- абстрактно синхронизиран
- абстрактно стриктноfp
Нека да приложим пример за абстрактен клас и абстрактен метод.
//abstract class abstract class Bank{ abstract int getInterestRate(); } //concrete class class Citi extends Bank{ int getInterestRate(){return 7;} } //concrete class class HSBC extends Bank{ int getInterestRate(){return 6;} } class Main{ public static void main(String args()){ Bank b; b = new Citi (); // concrete class object System.out.println('Citi Rate of Interest is: '+b.getInterestRate()+'%'); b = new HSBC (); // concrete class object System.out.println('HSBC Rate of Interest is: '+b.getInterestRate()+'%'); } }
Изход:
В горния пример имаме клас Bank. В този клас имаме абстрактен метод, getInterestRate (). След това декларираме два класа - ICICI и BOI, които наследяват от класа Bank. И двата класа изпълняват метода getInterestRate () чрез връщане на съответните лихвени проценти.
След това в основния метод създаваме банков обект. Първо, банковият обект съдържа обект от клас ICICI и показва лихвения процент. След това се създава обектът BOI и той показва лихвения процент.
По този начин можем да приемем, че класът Банка е нещо като скица или структура, която ни позволява да получим лихвен процент. От тази структура можем да създадем колкото конкретни класове искаме и след това да получим съответните лихвени проценти за всеки банков обект (това е показано в основния метод).
Каква е ползата от абстрактния клас в Java
Защо използваме абстрактен клас, когато в действителност той няма никаква собствена реализация?
Заедно с отговора на горния въпрос, ще илюстрираме и как да използваме абстрактния клас в примера, който следва.
Нека разгледаме пример за превозни средства. Знаем, че превозните средства могат да бъдат от много видове. Можем да имаме автомобили, скутери, велосипеди, мотопеди, автобуси и др. Въпреки че има много видове превозни средства, те имат някои свойства или атрибути, които са общи за всички превозни средства, независимо от техния тип.
вид грешки при тестване на софтуер
Например, всяко превозно средство има модел, номер на шасито, цвят и др. Всяко от тях има функции като стартиране, спиране, ускоряване, спиране и др. Сега всяко превозно средство ще има горните свойства и методи, които са общи за останалите. В същото време като потребител на превозно средство може да не се интересуваме от някои аспекти.
Например, ако човек управлява автомобил, това, което ще се интересува, е просто да стартира и спре автомобила или да ускори или да спре автомобила. Той / тя няма да се интересува от това как превозното средство започва или спира. Ние се интересуваме само от абстрактната работа на функциите, а не от техните подробности.
Сега, ако искаме да представим горната примерна система в софтуерно приложение, тогава как да я проектираме? На първо място, ще приложим някаква абстракция. Сега знаем, че някои функции са често срещани, но в зависимост от всеки модел изпълнението на тези функции ще бъде различно.
Като начало декларираме абстрактен клас „Превозно средство“.
Показахме тази система по-долу:
Така че ще имаме абстрактен клас Vehicle и ще има конкретен клас, представящ всеки модел на автомобила. За целите на илюстрацията използвахме само три модела, т.е. кола, велосипед и скутер.
По-долу е дадена йерархията на класовете от горната система.
abstract class Vehicle{ abstract void start () ; abstract void stop (); abstract void accelerate (); abstract void brake (); } class Car extends Vehicle{ void start () { //code here…} void stop () { //code here…} void accelerate () { //code here…} void brake () { //code here…} } class Bike extends Vehicle{ void start () { //code here…} void stop () { //code here…} void accelerate () { //code here…} void brake () { //code here…} } class Scooter extends Vehicle{ void start () { //code here…} void stop () { //code here…} void accelerate () { //code here…} void brake () { //code here…} }
Така че ще имаме клас на абстрактно превозно средство и три класа Car, Bike и Scooter. Всеки от тези класове ще разшири класа Vehicle и ще замени всеки от абстрактните методи.
По този начин като цяло, когато трябва да представим такава система, която има общи методи или операции за представяне, а след това да представим само външната перспектива на потребителя, ние се насочваме към абстракция. В резултат на това изваждаме общите методи и ги представяме като абстрактни методи и събираме тези абстрактни методи в общ абстрактен клас.
След като имаме очертанията на система, представена като абстрактен клас, а операциите като абстрактни методи, тогава можем да извлечем произволен брой класове от дадения абстрактен клас и да заменим абстрактните методи, за да приложим тези операции за всеки клас.
По този начин става полезно да се проектира система.
Абстрактен клас и интерфейс
Видяхме абстрактния клас по-горе. Интерфейсите са още други градивни елементи, които прилагат абстракция. Интерфейсите са договори и класовете, изпълняващи интерфейса, трябва да спазват тези договори.
Договорите в интерфейсите не са нищо друго освен методи, които не се прилагат. Вътре в интерфейсите ще имаме само прототипи на методи. Няма да има нито едно изпълнение на методи в интерфейсите.
Ако имаме декларация за интерфейс, както следва:
public interface interfaceA{ void myInterfaceMethod (); }
Тогава всеки клас, който реализира interfaceA, трябва да замени ‘myInterfaceMethod’.
Ако изобщо не заменим метода в клас, тогава този клас се представя като абстрактен.
abstract class TestClass implements interfaceA{ // not a compulsion to override myInterfaceMethod. }
По-късно ще имаме отделен урок за интерфейса.
След това нека обсъдим някои от разликите между абстрактните класове и интерфейсите в Java.
Разлика между абстрактния клас и интерфейса
Абстрактен клас | Интерфейс |
---|---|
Абстрактният клас може да има частни или защитени членове на данни освен публични членове. | Членовете на интерфейса по подразбиране са публични. |
Абстрактният клас може да има абстрактни и / или не абстрактни методи. | Интерфейсът може да има само абстрактни методи. |
Резюмето може или не може да съдържа крайните променливи. | Интерфейсите могат да финални променливи като променливи по подразбиране. |
Абстрактният клас може да има окончателни, статични или нестатични или нефинални променливи. | Интерфейсите могат да имат само крайни и статични променливи. |
Абстрактният клас може да осигури изпълнение на интерфейс. | Интерфейсите не могат да реализират абстрактен клас. |
Абстрактният клас се наследява с помощта на ключовата дума „extends“. | Интерфейсът е реализиран с помощта на ключовата дума “implements”. |
Абстрактният клас може да разшири други класове или да реализира множество интерфейси. | Интерфейсът може да реализира само друг интерфейс. |
Кога да използвам абстрактния клас и интерфейс в Java
Решението за това кога да се използва абстрактен клас и кога да се използват интерфейси в Java приложението трябва да се вземе интелигентно след цялостно разбиране на проблема. Има два аспекта, които трябва да вземем предвид, както е показано по-долу.
Абстрактни класове с частично поведение
Знаем, че абстрактните класове може да не се изпълняват напълно по-малко. Те могат да имат частично поведение. От друга страна, интерфейсите нямат никакво изпълнение. Така че, когато трябва да избираме между абстрактния клас и изпълнението, тогава трябва да разгледаме този аспект на нашето приложение.
Това означава, че първо трябва да решим дали приложението, което проектираме, има някакво общо частично изпълнение, което можем да отделим в абстрактния клас.
Например, помислете, че ние проектираме уеб приложение. За целта ще трябва да използваме някои уеб технологии като Servlet, REST API и др. Сега всяка от тези уеб технологии има някои техники или стъпки, които трябва да бъдат внедрени, независимо от приложението, което разработваме. След това изграждаме нашето персонализирано приложение.
Така че в този случай определеният код, който уеб технологията трябва да изпълни, може да бъде поставен в абстрактен клас. Можем ли да имаме интерфейс за това? Не. Това е така, защото интерфейсът не може да има изпълнение.
Интерфейси само по договор
Знаем, че интерфейсите имат договори или методи, които са част от тях. Тези методи са само прототипи. Трябва да приложим тези интерфейси в клас и след това да заменим методите.
как да играя SWF файлове на Windows
Сега помислете за интерфейса Map на Java Collections Framework. Много класове като HashMap, TreeMap и HashTable и др. Прилагат този интерфейс. Всеки от тези класове има различно изпълнение. Те нямат общо поведение, което може да бъде представено в абстрактния клас.
Така че това, което правим, е да проектираме интерфейс с прототипите на методите и след това да внедрим всеки от класовете.
По този начин трябва да преценим правилно всеки фактор, преди да изберем между абстрактния клас и интерфейса.
Разлика между абстракция и капсулиране
Нека обсъдим някои от разликите между абстракцията и още една важна характеристика на ООП, т.е. капсулирането.
Абстракция | Капсулиране |
---|---|
Процес на получаване и абстрахиране на информацията | Процес на обвързване на информацията. |
Техниката на абстракция е на ниво дизайн или интерфейс. | Механизмът за капсулиране е на ниво изпълнение. |
Абстракцията скрива детайлите. | Капсулирането обвързва информацията в едно звено, което осигурява информационна сигурност. |
Абстракцията се реализира с помощта на абстрактни класове и интерфейси. | Модификаторите за достъп, а именно публичен, частен и защитен, и по подразбиране играят роля при капсулирането. |
В абстракцията единственият абстрактен изглед се представя на потребителя, докато сложните и подробни данни са скрити от потребителя. | При капсулирането данните се групират като единица и могат да бъдат защитени или направени достъпни с помощта на модификатори на достъпа и методи за получаване и задаване. |
често задавани въпроси
В # 1) Абстракцията и данните крият ли се еднакво?
Отговор: Не, абстракцията и скриването на данни не е едно и също. Но и двете са важни характеристики на обектно-ориентираното програмиране. Докато абстракцията е процес на скриване на фоновите детайли, скриването на данни е техника за изолиране на данните от директен достъп.
В # 2) Какви са предимствата на абстракцията?
Отговор: Няколко предимства на абстракцията са дадени по-долу:
- Чрез скриване на подробностите за фона и излагане само на абстрактния изглед на потребителя, абстракцията прави кода по-опростен и по-четлив.
- Тъй като абстракцията предпазва ненужните детайли, тя прави кода по-малък.
- Поддръжката на кода може да стане сложна и трудна без абстракция.
В # 3) Защо абстракцията е толкова важна?
Отговор: Абстракцията ни позволява да скрием фонови детайли, които са важни и могат да доведат до хаос, ако излязат в света. Чрез скриване на подробностите за фона и излагане само на потребителя на необходимия интерфейс, абстракцията прави приложенията по-опростени.
В # 4) Обяснете абстракцията с пример в реално време.
Отговор: Има много примери за абстракция в реално време, включително геометрични фигури, превозни средства и др. Друг пример е ATM (Automated Teller Machine). Банкоматът поддържа операции като теглене на пари в брой, проверка на баланса, превод на пари и др. Но ние не сме наясно как тези операции работят вътрешно.
Даден ни е само монитор с потребителски интерфейс за избор и извършване на необходимите операции.
В # 5) Можем ли да постигнем абстракция без капсулиране?
Отговор: Абстракцията предпазва подробностите за изпълнението, а капсулирането скрива подробностите за обекта. Обектът е абстрактната форма на реалния свят и детайлите му са скрити с помощта на капсулиране. По този начин за абстракция е необходимо капсулиране.
Заключение
В този урок обсъдихме подробно абстракцията в Java. Абстракцията е техника за скриване на ненужни детайли от потребителя. Потребителят получава достъп само до съответните подробности. Операциите с превозни средства или банкомати са класически примери за абстракции в реалния свят.
Когато използваме банкомат, ние се интересуваме само от извършване на операции като теглене на пари в брой и т.н., без да се налага да знаем подробности как точно тази операция се извършва вътрешно.
Java осигурява абстракция чрез абстрактни класове и интерфейси. Докато интерфейсите осигуряват 100% абстракция, абстрактните класове осигуряват частична абстракция. Изборът между интерфейси и абстрактни класове трябва да бъде направен в зависимост от приложението, което трябва да бъде разработено, както и каква информация трябва да бъде изложена на потребителя.
Също така обсъдихме абстрактните методи в този урок заедно с разликите между абстрактните класове и интерфейси.
=> Проверете ВСИЧКИ уроци за Java тук.
Препоръчително четене
- Урок за интерфейс на Java и абстрактен клас с примери
- Java Integer и Java BigInteger клас с примери
- Урок за клас Java Scanner с примери
- Какво е Java Vector | Урок за Java Vector Class с примери
- Java Enum: Урок за изброяване на Java с примери
- Основи на Java: Синтаксис на Java, клас Java и основни концепции на Java
- Урок за JAVA за начинаещи: 100+ практически ръководства за Java видео
- Java Iterator: Научете се да използвате итератори в Java с примери